基于组 SQL Netezza 过滤数据

Posted

技术标签:

【中文标题】基于组 SQL Netezza 过滤数据【英文标题】:Filter data based on group SQL Netezza 【发布时间】:2021-05-23 20:06:05 【问题描述】:

请给我下表,我需要根据 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

【问题讨论】:

【参考方案1】:

您可以在ORDER BY 子句中使用ROW_NUMBER() 窗口函数和CASE 表达式:

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 Cust_ID C_Date
123456 3432 null
987654 1122 2021-02-21

【讨论】:

非常感谢@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;

【讨论】:

以上是关于基于组 SQL Netezza 过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

将一个表的数据加载到驻留在不同数据库中的另一个表中 - Netezza

返回 Netezza SQL 中每个组的最大值日期

选择语句从 Netezza 数据库中获取数据并插入 SQL Server 数据库 (SSIS)

基于星期几返回计数或空值的 Netezza SQL 语句

SQL Server 到 Netezza 数据类型等效

Netezza SQL 仅显示去年的数据