我有一个表格,下面有相关列 A-C,试图实现 D。
A 栏 | B 栏 | C 栏 | D 栏 |
---|---|---|---|
A | 123 | 约翰 | 0 |
B | 456 | 哑光 | 3 |
B | 456 | 哑光 | 3 |
B | 456 | 哑光 | 3 |
B | 456 | 哑光 | 3 |
B | 789 | 哑光 | 3 |
B | 234 | 哑光 | 3 |
B | 967 | ELISA | 1 |
逻辑是 - 如果列 A = 'B',则列 D 应返回列 B 的不同值的数量,并按列 C 进行分区。
我认为我非常接近解决方案 - 目前我有这样的逻辑:
COUNT(CASE WHEN A = 'B' THEN 1 ELSE NULL END) OVER (PARTITION BY C)
但是,上面的“Matt”返回 6,计算所有行,而不仅仅是不同的行。我希望看到 3,代表唯一 ID“456”、“789”和“234”。将 COUNT(DISTINCT) 放入 CASE WHEN 语句中似乎会破坏整个事情。我已经为此苦苦挣扎了一段时间,到目前为止还无法找到解决方案。有没有一种方法可以在我缺少的一行中执行此操作,或者我是否需要开始添加子查询/CTE?
感谢您的帮助。
NVM 我明白了。
CASE WHEN (A = 'B') THEN COUNT(DISTINCT B) OVER (PARTITION BY C) ELSE NULL END
似乎给出了正确的行为。
我不确定“distinct”关键字是否可以与 SQL Server 中的 over 子句一起使用。但不确定其他数据库。我已经想出了可以解决问题的解决方案。请看下面。
select a.* ,
case when a.ColumnA = 'B' then b.counT_CoulumnB
else 0 end as ColumnD
from col as a inner join
(
select
ColumnC ,
ColumnA ,
count(distinct ColumnB) as counT_CoulumnB
from col
group by ColumnC , ColumnA
) as b on a.ColumnA = b.ColumnA and a.ColumnC = b.ColumnC
order by a.ColumnA , case when a.ColumnA = 'B' then b.counT_CoulumnB
else 0 end desc;