基于另一列对分区依据进行不同计数?

问题描述 投票:0回答:2

我有一个表格,下面有相关列 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?

感谢您的帮助。

sql snowflake-cloud-data-platform case distinct partition
2个回答
1
投票

NVM 我明白了。

CASE WHEN (A = 'B') THEN COUNT(DISTINCT B) OVER (PARTITION BY C) ELSE NULL END

似乎给出了正确的行为。


0
投票

我不确定“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;
© www.soinside.com 2019 - 2024. All rights reserved.