使用 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 项:
group by
必须包含 select 中的相同字段(不在聚合函数中)。因为不需要按 CID
分组,所以应该从 select. 中删除
- 您可以对不在分组依据中但在聚合函数中的字段使用
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
结果:
我有 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 项:
group by
必须包含 select 中的相同字段(不在聚合函数中)。因为不需要按CID
分组,所以应该从 select. 中删除
- 您可以对不在分组依据中但在聚合函数中的字段使用
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
结果: