【问题标题】:SQL window using Case (Teradata)使用 Case (Teradata) 的 SQL 窗口
【发布时间】:2021-09-08 20:58:11
【问题描述】:

我在 Teradata 中有一张表格,其中包含客户及其与某些产品的交易。

Client Product Date
C1 P1 1.1.2020
C1 P1 31.1.2020
C1 P2 1.2.2020
C1 P3 1.3.2020
C2 P2 1.4.2020
C2 P2 1.5.2020

我需要一个选择,它将为每个客户返回一行,其中包含所有产品的最后交易日期和所选产品的最后交易日期,例如P1。如果P1没有销售,则显示为null。

Client LastP LastP1
C1 1.3.2020 31.1.2020
C2 1.5.2020 null

我可以单独获取值,但如何为每个客户端接收一行?

SELECT
Max (Date) Over (PARTITION BY Client) AS LastP,
CASE WHEN Product='P1'
 THEN Max (Date) Over (PARTITION BY Client, Product)
ELSE NULL END AS LastP1

感谢您的建议。

【问题讨论】:

    标签: sql teradata window-functions


    【解决方案1】:

    您必须将CASE 表达式移动到MAX() 窗口函数中,并仅按客户端进行分区:

    SELECT DISTINCT Client,
           MAX(Date) Over (PARTITION BY Client) AS LastP,
           MAX(CASE WHEN Product='P1' THEN Date END) Over (PARTITION BY Client) AS LastP1
    FROM tablename
    

    或者更简单:

    SELECT Client,
           MAX(Date) AS LastP,
           MAX(CASE WHEN Product='P1' THEN Date END) AS LastP1
    FROM tablename
    GROUP BY Client
    

    请参阅demo

    【讨论】:

    • 谢谢,这正是我想要的。我正在尝试更复杂的解决方案 :-) 现在,这很简单明了。
    【解决方案2】:
     WITH YOUR_TABLE_SAMPLE(CLIENT,PRODUCT,DATE) AS
    (
       SELECT 'C1' ,    'P1', CAST('20200101'AS DATE) UNION ALL
       SELECT 'C1',     'P1' ,  CAST('20200131' AS DATE)UNION ALL
       SELECT'C1' , 'P2' ,  CAST('20200201' AS DATE)UNION ALL
       SELECT'C1' , 'P3' ,  CAST('20200301'AS DATE)UNION ALL
       SELECT'C2' , 'P2' ,  CAST('20200401'AS DATE)UNION ALL
       SELECT'C2' , 'P2' ,  CAST('20200501'AS DATE)
    )
    SELECT  C.CLIENT,MAX(C.DATE)LAST_TRADE_DATE,
     MAX(
          CASE WHEN C.PRODUCT='P1'THEN C.DATE
          ELSE NULL
          END
       )AS LAST_P1_TRADE_DATE
     FROM YOUR_TABLE_SAMPLE AS C
     GROUP BY C.CLIENT
    

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2019-03-31
      • 2023-04-10
      • 2018-04-16
      • 2015-09-03
      • 1970-01-01
      • 2017-01-10
      • 2019-05-22
      • 2018-11-16
      相关资源
      最近更新 更多