基于组 SQL Netezza 过滤数据

问题描述

请我有下表,我需要根据 DATE 列过滤数据, 在 Sus_ID 级别,如果 DATE 列有 NULL 获取此行,或者如果没有 NULL 记录将获取最新 DATE 的行

|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

解决方法

您可以在 ROW_NUMBER() 子句中使用带有 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

参见 demo(对于 MySql 但它是标准 SQL)。
结果:

Subs_ID 客户 ID C_Date
123456 3432 null
987654 1122 2021-02-21
,

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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...