【问题标题】:In Teradata, with SQL, how do I compare multiple dates and select the latest date?在 Teradata 中,使用 SQL,如何比较多个日期并选择最新日期?
【发布时间】:2016-08-03 22:43:33
【问题描述】:

下面是表格和所需的输出。

我想选择 IDSTATUSDATE 其中 DATE 是最新日期。如果DATE相同,只选择STATUS = A的记录.

我需要能够在 Teradata 中使用 SQL 执行此操作。

表格:

ID        STATUS        DATE
5550500     A          11/02/2016
5550500     I          8/08/2008
5551688     A          23/08/2013
5551688     I          23/08/1997
5551688     I          23/08/2013
5551966     I          18/10/1999
5551966     I          24/10/2003
5551966     I          10/11/1997
5551966     I          2/09/2014

所需输出:

ID        STATUS        DATE
5550500    A           11/02/2016
5551688    A           23/08/2013
5551966    I           2/09/2014

【问题讨论】:

    标签: sql teradata greatest-n-per-group


    【解决方案1】:

    如何将row_number 与子查询一起使用:

    select *
    from (
        select id, status, date, 
               row_number() over (partition by id 
                                  order by date desc, status) rn
        from yourtable
    ) t
    where rn = 1
    

    【讨论】:

    • 谢谢 我测试了代码,似乎运行良好,你能解释一下它是如何工作的吗?
    • @Tikkaty -- 这会建立一个按 id 分区(或按 id 分组)和按最近日期排序的行号,然后按状态排序。然后,您只需选择每组的第一个 (where rn = 1),然后您就有了您的列表。
    【解决方案2】:

    Teradata 支持语法扩展以直接过滤窗口聚合函数的结果,而无需派生表:

    select *
    from tab
    QUALIFY -- similar to HAVING after GROUP BY
       row_number() -- or RANK to return multiple rows with the same (max date & status)
       over (partition by id 
             order by date desc, status) = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2022-01-19
      • 2014-08-07
      相关资源
      最近更新 更多