TABLE1
mach_id | optout | time |
---|---|---|
16543 | NULL | 2022-09-27 |
16543 | YES | 2022-09-26 |
16543 | NO | 2022-09-25 |
14444 | YES | 2022-09-27 |
15676 | NO | 2022-09-27 |
15676 | YES | 2022-09-26 |
11111 | NULL | 2022-09-27 |
11111 | NULL | 2022-09-26 |
Required table
mach_id | optout |
---|---|
16543 | YES |
14444 | YES |
15676 | NO |
11111 | NULL |
I want to get the max optout value other than null if there are any other values for a mach_id based on time. If every optout value is null for mach_id optout should be null. How can I query it?
I wrote this query but it's not working
Select max(COALESCE(OPTOUT, 0)) AS optout,mach_id
from
(select OPTOUT,mach_id, time from table1)
where
time=max(time)
group by mach_id
CodePudding user response:
It is possible to achieve it using QUALIFY
:
SELECT *
FROM tab
QUALIFY ROW_NUMBER() OVER(PARTITION BY mach_id
ORDER BY optout IS NOT NULL DESC, time DESC) = 1;
Output:
CodePudding user response:
We can use ROW_NUMBER
here:
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY mach_id
ORDER BY optout IS NULL, time DESC) rn
FROM table1 t
)
SELECT mach_id, optout
FROM cte
WHERE rn = 1;
The sort in the call to ROW_NUMBER
places, for each group of mach_id
records, the non null optout
values first. Within those subgroups, the record with the latest time is chosen. A null optout
record can only appear in the result set if only such null records are available.