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
我在 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