Home > Software engineering >  SQL max row value other than null
SQL max row value other than null

Time:09-28

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:

enter image description here

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.

  • Related