2017-04-19 34 views
1

我試圖找到一種基於組的計數方法,我無法找出一種方法而無需使用遊標。由於使用光標會比較慢,所以我希望可能有更好的方法。SQL SERVER COUNT LEAD條件組BY

+----+--------+-------+--------+ 
    | ID | NEXTID | RowNo | Status | 
    +----+--------+-------+--------+ 
    | 1 |  2 | 1 |  1 | 
    | 2 |  3 | 1 |  1 | 
    | 3 |  4 | 1 |  0 | 
    | 4 |  | 1 |  1 | 
    | 1 |  2 | 2 |  0 | 
    | 2 |  3 | 2 |  1 | 
    | 3 |  4 | 2 |  1 | 
    | 4 |  | 2 |  1 | 
    | 1 |  2 | 3 |  1 | 
    | 2 |  3 | 3 |  1 | 
    | 3 |  4 | 3 |  1 | 
    | 4 |  | 3 |  1 | 
    +----+--------+-------+--------+ 

我現在希望計算組狀態列導致:

簡化爲數據結構

+-----+-------------+ 
    | Row | StatusCount | 
    +-----+-------------+ 
    | 1 |   2 | 
    | 1 |   1 | 
    | 2 |   3 | 
    | 3 |   4 | 
    +-----+-------------+ 

用於測試目的我創建了下面的代碼:

SELECT 
     ID, 
     NEXTID, 
     RowNo, 
     Status, 
     LEAD(ID,1,0) 
      OVER (ORDER BY RowNo,ID) AS LEADER 
    INTO #TestTable 
    FROM 
    (
     VALUES 
      (1, 2, 1, 1), 
      (2, 3, 1, 1), 
      (3, 4, 1, 0), 
      (4, '', 1, 1), 
      (1, 2, 2, 0), 
      (2, 3, 2, 1), 
      (3, 4, 2, 1), 
      (4, '', 2, 1), 
      (1, 2, 3, 1), 
      (2, 3, 3, 1), 
      (3, 4, 3, 1), 
      (4, '', 3, 1) 

    ) 
    AS TestTable(
     ID, 
     NEXTID, 
     RowNo, 
     Status); 
    GO 

    SELECT 
     RowNo, 
     Count(Status) AS StatusCount 
    FROM #TestTable 
    WHERE 
     Status = 1 
    GROUP BY 
     RowNo 

此結果

 +-----+-------------+ 
    | Row | StatusCount | 
    +-----+-------------+ 
    | 1 |   3 | 
    | 2 |   3 | 
    | 3 |   4 | 
    +-----+-------------+ 

不分隔第一行。我意識到我需要另一個GROUP BY條件,但我無法弄清楚適當的條件。

非常感謝您的幫助。如果這已經得到解答,我無法找到主題和提示也將不勝感激。

隨着親切的問候 freubau

回答

0

您可以通過執行零的累加值達到每個號碼識別組。然後,剩下的只是聚集:

select rowno, count(*) 
from (select t.*, 
      sum(case when status = 0 then 1 else 0 end) over (partition by rowno order by id) as grp 
     from #TestTable t 
    ) t 
where status = 1 
group by rowno, grp 
order by rowno, grp; 

Here是它的一個雷克斯測試儀。

+0

非常感謝您的代碼片段。我試過了,它給了我期望的結果。我不明白它是如何工作的,但我確信在閱讀使用的語法時我最終能夠做到。 – freubau

+0

@freubau。 。 。子查詢,看看'grp'是如何計算的。 –

+0

再次感謝您的幫助。我覺得沒有提出完美描述我正在嘗試做什麼的術語分區這種說法很愚蠢。無論如何,我能夠取代目前使用的光標功能,它的使用時間超過了十倍。 – freubau