使用 CASE WHEN 的条件计数

Conditional count using CASE WHEN

我有 table 如下

CID ITEM    FLAG
C_1 ITEM_1  0
C_1 ITEM_2  1
C_1 ITEM_2  1
C_1 ITEM_2  0
C_2 ITEM_2  0
C_3 ITEM_2  1
C_3 ITEM_2  1
C_3 ITEM_3  1

我想生产 table 喜欢

CID UNIQ_CNT_OF_CID
ITEM_1  0
ITEM_2  2
ITEM_3  1

问题是 - 我想为相同的 CID 计算一次 CID

我试过了,

SELECT  ITEM, CID,
      case when FLAG =1 then count(distinct CID)  else 0 end  as COUNTER 
      from T  
      group by ITEM

请帮忙!!

我想我理解你的问题,如果不明白请告诉我。

您可以使用窗口函数来完成此操作:

SELECT
ITEM,
COUNT(DISTINCT CID) OVER (PARTITION BY ITEM) AS UNIQ_CNT_OF_CID
FROM T

这会给你相同的行数,所以如果你想从中获得唯一性,你可以使用 CTE 或子查询,如下所示:

SELECT DISTINCT
ITEM, UNIQ_CNT_OF_CID
FROM
    (
    SELECT
    ITEM,
    COUNT(DISTINCT CID) OVER (PARTITION BY ITEM) AS UNIQ_CNT_OF_CID
    FROM T
    ) final

你很接近。要指出的 2 项:

  1. group by 必须包含 select 中的相同字段(不在聚合函数中)。因为不需要按 CID 分组,所以应该从 select.
  2. 中删除
  3. 可以对不在分组依据中但聚合函数中的字段使用CASE

所以修改你的 SQL 现在看起来像这样:

SELECT ITEM,
    -- The CID is used inside the case, inside the count function.
    -- NULL will not be included in the count
    COUNT(DISTINCT CASE WHEN FLAG = 1 THEN CID ELSE NULL END) AS COUNTER 
    from T 
    group by ITEM

结果: