1 sql teradata window-functions
我是新手,尝试过 Stackoverflow 上有关 SQL 的帖子中的各种提示,但未能解决这个问题。我有一个表,它是表连接的结果,看起来像这样
表A
cust_id prod_type
001 A
001 A
002 A
002 B
003 A
003 C
Run Code Online (Sandbox Code Playgroud)
我需要应用逻辑:如果对于每个 cust_id 至少有一个 prod_type 为 B 或 C 的值,则返回相应的 prod_type 值。如果对于每个 cust_id,prod_type 的所有值均为 A,则返回 A。
我想要得到的最终输出是
表B
cust_id prod_type
001 A
002 B
003 C
Run Code Online (Sandbox Code Playgroud)
我尝试过使用
SELECT
A.cust_id
,CASE WHEN prod_type in ('B', 'C') THEN prod_type OVER (PARTITION BY A.cust_id)
ELSE 'A' OVER (PARTITION BY A.cust_id) END AS product
FROM ([Joined Tables]) AS A
Run Code Online (Sandbox Code Playgroud)
并且 teradata 似乎不允许在 case 语句中使用 over(clause):需要在 prod_type 和 OVER 关键字之间使用“END”关键字。
您想为每个客户只返回一行最匹配的数据product_type吗?
如果有附加列:
SELECT
A.cust_id
,prod_type
,...
FROM ([Joined Tables]) AS A
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY CUST_ID
ORDER BY CASE WHEN prod_type in ('B', 'C') -- best match first
THEN 1
ELSE 2
END,
prod_type) = 1
Run Code Online (Sandbox Code Playgroud)
否则 @Frisbee'sMAX会起作用,但我假设 A/B/C 不是您的实际产品名称:
SELECT
A.cust_id
,COALESCE(MAX(CASE WHEN prod_type in ('B', 'C') THEN prod_type END)
,MAX(CASE WHEN prod_type not in ('B', 'C') THEN prod_type END))
FROM ([Joined Tables]) AS A
GROUP BY just_id
Run Code Online (Sandbox Code Playgroud)