繁体   English   中英

SQL Server Count Distinct 记录在窗口函数中具有特定条件

[英]SQL Server Count Distinct records with a specific condition in window functions

我有一个类似于下面的表:

团体 贸易月 旗帜
一种 1
一种 三月 1
一种 三月 0
一种 0
二月 1
四月 1
九月 1
九月 1

我需要有一个列来计算每个 Group具有非零值(flag=1)的不同月份的数量。 我更喜欢使用窗口函数(而不是分组依据),并且我知道 sql server 中的窗口函数中不允许使用 count distinct ,因此非常感谢有关如何使用窗口函数计算该值的任何解决方案。 结果应如下所示:

团体 贸易月 旗帜 #of flagged_months(不同)
一种 1 2
一种 三月 1 2
一种 三月 0 2
一种 0 2
二月 1 3
四月 1 3
九月 1 3
九月 1 3

不幸的是你不能做COUNT(DISTINC ...) OVER () ,但这是一种解决方法


with
cte as
(
    select  *,
            dr = dense_rank() over (partition by [Group], flag order by [TradeMonth])
    from    yourtable
)
select  [Group], [TradeMonth], flag,
        max(case when flag = 1 then dr end) over (partition by [Group])
from    cte

dbfiddle 演示

试试这个

create table #test([Group] varchar(1), TradeMon Varchar(10), Flag int)
insert into #test values ('A', 'Jan', 1),('A', 'Mar', 1),('A', 'Mar', 0),('A', 'Jun', 0),('B', 'Feb', 1),('B', 'Apr', 1),('B', 'Sep', 1),('B', 'Sep', 1)


With distinctCount AS
(
    SELECT [group], COUNT(1)DistinctCount
    FROM
    (
        select distinct  [group], TradeMon
        from #test
        where flag=1
    )T GROUP BY [group]
)
SELECT T.[GROUP], T.TradeMon, T.Flag, DC.DistinctCount
FROM #test T
INNER JOIN distinctCount DC ON  (T.[GROUP] = DC.[Group])

你实际上可以用一个表达式来做到这一点:

select t.*,
       (dense_rank() over (partition by group
                           order by (case when flag = 1 then trademonth end)
                          ) +
        dense_rank() over (partition by group
                           order by (case when flag = 1 then trademonth end) desc
                          ) -
        (1 + min(flag) over (partition by trademonth))
       ) as num_unique_flag_1        
from t;

这里的逻辑是什么? 具有升序排序和降序排序的dense_rank()的总和比不同值的数量多一。

在正常情况下(即计算不同月份的数量),您只需减去 1。

但是,在这种情况下,您将 0 值视为NULL 这些仍然被计算在内,但只有其中之一。 因此,您可以根据是否存在0值减去 1 或 2。 瞧! 结果是标志为 1 的不同月份的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM