Фильтровать данные на основе группового SQL Netezza

#sql #filter #greatest-n-per-group #netezza

#sql #Фильтр #наибольшее число пользователей на группу #netezza

Вопрос:

Пожалуйста, у меня есть таблица ниже, мне нужно отфильтровать данные на основе столбца ДАТЫ на уровне Sus_ID, если столбец ДАТЫ имеет значение NULL, получить эту строку или если запись не имеет значения NULL, получит строку для самой последней ДАТЫ

 |Sub_ID |Cust_ID    |C_Date    |
|------- ----------- ----------|
|123456 |2233       |2021-02-21|
|123456 |2211       |2021-01-21|
|123456 |3432       |NULL      |
|987654 |1122       |2021-02-21|
|987654 |3322       |2021-01-21|
 

желаемый результат должен быть следующим

 |Sub_ID |Cust_ID    |C_Date    |
|------- ----------- ----------|
|123456 |3432       |NULL      |
|987654 |1122       |2021-02-21|
 

Я попробовал приведенный ниже код, но он не сработал

     Subs_ID,
    CASE
        WHEN C_Date IS NULL THEN Cust_ID
        ELSE (FIRST_VALUE(Cust_ID) OVER (PARTITION BY Subs_ID ORDER BY C_Date DESC )) END AS Cust_ID_N
    FROM
        tbl
 

Ответ №1:

Вы можете использовать ROW_NUMBER() функцию window с CASE выражением в ORDER BY предложении:

 SELECT Subs_ID, Cust_ID, C_Date
FROM (
  SELECT *,
         ROW_NUMBER() OVER (
                        PARTITION BY Subs_ID 
                        ORDER BY CASE WHEN C_Date IS NULL THEN 1 ELSE 2 END, C_Date DESC 
                      ) rn
  FROM tablename
) t
WHERE rn = 1
 

ORDER BY Предложение также может быть упрощено до:

 ORDER BY C_Date IS NULL DESC, C_Date DESC
 

Смотрите демонстрацию (для MySQL, но это стандартный SQL).
Результаты:

Subs_ID Cust_ID C_Date
123456 3432 null
987654 1122 2021-02-21

Комментарии:

1. большое спасибо, @forpas за вашу отличную поддержку

Ответ №2:

Netezza поддерживает стандартный синтаксис SQL NULLS FIRST . Я бы рекомендовал вам использовать это:

 select t.*
from (select t.*,
             row_number() over (partition by sub_id order by c_date desc nulls first) as seqnum
      from t
     ) t
where seqnum = 1;