[英]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
試試這個
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.