#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;