根据另一列计算不同的分区?

Count Distinct Over Partition By, Based on Another Column?

提问人:ssubr 提问时间:11/8/2023 更新时间:11/9/2023 访问量:31

问:

我在下面有一个包含相关列 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?

感谢您的帮助。

sql snowflake-cloud-data-platform 大小写 Distinct 分区

评论


答:

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;