【问题标题】:Filter data based on group SQL Netezza基于组 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

【问题讨论】:

    标签: sql filter greatest-n-per-group netezza


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2012-09-18
      • 2018-10-11
      相关资源
      最近更新 更多