SQL window 使用案例 (Teradata)

SQL window using Case (Teradata)

我在 Teradata 中有一个 table 与客户以及他们与某些产品的交易。

客户 产品 日期
C1 P1 1.1.2020
C1 P1 2020 年 1 月 31 日
C1 P2 1.2.2020
C1 P3 1.3.2020
C2 P2 1.4.2020
C2 P2 1.5.2020

我需要一个 select,每个客户 return 一行,所有产品的最后交易日期和 selected 产品的最后交易日期,例如P1。如果P1没有售卖,则显示为null。

客户 最后一个 最后P1
C1 1.3.2020 2020 年 1 月 31 日
C2 1.5.2020

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

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

感谢您的建议。

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

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

 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