SQL:case语句结束时(分区依据)

时间:2016-01-12 13:51:25

标签: sql teradata window-functions

我在这里很新,并尝试过有关SQL的Stackoverflow帖子的各种提示,但还没有能够解决这个问题。 我有一个表是加入表的结果,看起来像这样

表A

cust_id  prod_type

 001         A
 001         A
 002         A
 002         B
 003         A
 003         C

我需要应用逻辑:如果每个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

我尝试过使用

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

似乎teradata不允许在案例陈述中使用over(子句):期望' END' prod_type和OVER关键字之间的关键字。

1 个答案:

答案 0 :(得分:3)

您希望每位客户只返回一行,且匹配度最高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

否则@Frisbee的MAX会起作用,但我认为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