SQL: case when 语句带有 over (partition by)

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”关键字。

dno*_*eth 5

您想为每个客户只返回一行最匹配的数据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)