2017-04-19 5 views
1

그룹을 기준으로 계산하는 방법을 찾으려고하고 커서를 사용하지 않고도 방법을 찾아 낼 수 없었습니다. Cursor를 사용하면 상대적으로 느려지므로 더 나은 방법이있을 수 있기를 바랍니다.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 | 
    +----+--------+-------+--------+ 

내가 지금의 결과 그룹에서 상태 열을 COUNT 할 : 다음과 같이

데이터가 구성되어 단순화 된

: 테스트 목적으로 나는 다음과 같은 코드를 작성하기위한

+-----+-------------+ 
    | 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

다시 도움 주셔서 감사합니다. 내가 뭘하려고했는지 완벽하게 묘사하는 용어 파티션을 생각지 않는다는 것에 어리 석다. 어쨌든 나는 현재 사용중인 Cursor 기능을 10 번 이상 대체 할 수있었습니다. – freubau