提问人:ssubr 提问时间:11/8/2023 更新时间:11/9/2023 访问量:31
根据另一列计算不同的分区?
Count Distinct Over Partition By, Based on Another Column?
问:
我在下面有一个包含相关列 A-C 的表格,试图实现 D。
A列 | B列 | C列 | D列 |
---|---|---|---|
一个 | 123 | John | 0 |
B | 456 | 马 特 | 3 |
B | 456 | 马 特 | 3 |
B | 456 | 马 特 | 3 |
B | 456 | 马 特 | 3 |
B | 789 | 马 特 | 3 |
B | 234 | 马 特 | 3 |
B | 967 | 酶联免疫吸附试验 | 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?
感谢您的帮助。
答:
1赞
ssubr
11/8/2023
#1
NVM 我想通了。
CASE WHEN (A = 'B') THEN COUNT(DISTINCT B) OVER (PARTITION BY C) ELSE 0 END
似乎给出了正确的行为。
0赞
Saikat
11/9/2023
#2
我不确定“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;
评论