2016-08-04 117 views
1

我想用一個分區運行不同數量逐年以下數據:運行重複計數與分區

DROP TABLE IF EXISTS #FACT; 
CREATE TABLE #FACT("Year" INT,"Month" INT, "Acc" varchar(5)); 
INSERT INTO #FACT 
    values 
     (2015, 1, 'A'), 
     (2015, 1, 'B'), 
     (2015, 1, 'B'), 
     (2015, 1, 'C'), 
     (2015, 2, 'D'), 
     (2015, 2, 'E'), 
     (2015, 3, 'E'), 
     (2016, 1, 'A'), 
     (2016, 1, 'A'), 
     (2016, 2, 'B'), 
     (2016, 2, 'C'); 
SELECT * FROM #FACT;  

下返回正確的答案,但有這也是一個更簡潔的方式高性能?

WITH 
dnsRnk AS 
(
    SELECT 
     "Year" 
     , "Month" 
     , DenseR = DENSE_RANK() OVER(PARTITION BY "Year", "Month" ORDER BY "Acc") 
    FROM #FACT 
), 
mxPerMth AS 
(
    SELECT 
     "Year" 
     , "Month" 
     , RunningTotal = MAX(DenseR) 
    FROM dnsRnk 
    GROUP BY 
     "Year" 
     , "Month" 
) 
SELECT 
    "Year" 
    , "Month" 
    , X = SUM(RunningTotal) OVER (PARTITION BY "Year" ORDER BY "Month") 
FROM mxPerMth 
ORDER BY 
    "Year" 
    , "Month"; 

以上的回報如下 - 答案也應該返回一模一樣的表:

enter image description here

+0

您可以編輯的問題,並顯示想要的結果? –

+0

@GordonLinoff現在提供:答案應該返回相同的 – whytheq

回答

1

如果你想獨立的帳戶的運行計數:

select f.*, 
     sum(case when seqnum = 1 then 1 else 0 end) over (partition by year order by month) as cume_distinct_acc 
from (select f.*, 
      row_number() over (partition by account order by year, month) as seqnum 
     from #fact f 
    ) f; 

這在每個帳戶出現的第一個月內統計每個帳戶。

編輯:

糟糕。以上不按年和月彙總,然後每年重新開始。這是正確的解決方案:

select yyyy, mm, 
     sum(sum(case when seqnum = 1 then 1 else 0 end) 
     ) over (partition by year order by month) as cume_distinct_acc 
from (select f.*, 
      row_number() over (partition by account, year order by month) as seqnum 
     from #fact f 
    ) f 
group by year, month 
order by year, month; 

而且,SQL小提琴不工作,但下面是一個例子:

with FACT as (
    SELECT yyyy, mm, account 
    FROM (values 
     (2015, 1, 'A'), 
     (2015, 1, 'B'), 
     (2015, 1, 'B'), 
     (2015, 1, 'C'), 
     (2015, 2, 'D'), 
     (2015, 2, 'E'), 
     (2015, 3, 'E'), 
     (2016, 1, 'A'), 
     (2016, 1, 'A'), 
     (2016, 2, 'B'), 
     (2016, 2, 'C')) v(yyyy, mm, account) 
    ) 
select yyyy, mm, 
     sum(sum(case when seqnum = 1 then 1 else 0 end)) over (partition by yyyy order by mm) as cume_distinct_acc 
from (select f.*, 
      row_number() over (partition by account, yyyy order by mm) as seqnum 
     from fact f 
    ) f 
group by yyyy, mm 
order by yyyy, mm; 
+0

我認爲這是一個好方法,但是目前它不會返回與問題中的腳本相同的結果:結果應該是相同的 – whytheq

1

Demo Here:

;with cte 
as 
(select yearr,monthh,count(distinct acc) as cnt from #fact 
group by yearr,monthh 
) 
select yearr,monthh, 
sum(cnt) over (Partition by yearr order by yearr,monthh rows unbounded preceding) as x 
from cte 
+0

這是SQL Server 2012之後支持的東西? –

+0

它支持從SQLServer 2012,如果多數民衆贊成你所要求的 – TheGameiswar

+0

嘗試使用它,給了我一個錯誤:'語法附近'前'' –