I have the following table (employee_organization):
| ID | employee_id | organization_id | start_date | end_date |
|---|---|---|---|---|
| 1 | 77 | 16 | 2021-01-01 | 2021-06-30 |
| 2 | 11 | 23 | 2020-01-01 | 2021-05-27 |
| 3 | 77 | 16 | 2021-08-01 | 2021-08-31 |
| 4 | 77 | 16 | 2021-09-01 | NULL |
I need a query to filter out records where employee_id = 77, organization_id = 16 and end_date is null. If no matching row has been found, than return a row with max(end_date). So, in the above sample table only row with id=4 should be returned.
CodePudding user response:
SELECT *
FROM table
WHERE {needed conditions}
ORDER BY end_date IS NULL DESC, end_date DESC LIMIT 1
CodePudding user response:
A generic solution is to use correlated subquery that finds greatest date per employee (nulls first):
select *
from t
where end_date <=> (
select end_date
from t as x
where x.employee_id = t.employee_id
order by end_date IS NOT NULL, end_date desc
limit 1
)
