2017-04-19 45 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