2017-04-19 7 views
1

グループに基づいてカウントする方法を見つけようとしていますが、Cursorを使用しなくても方法を見つけられませんでした。カーソルを使用するのは比較的遅いので、もっと良い方法があると思っていました。SQLサーバーカウント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 | 
    +----+--------+-------+--------+ 

私は今、その結果グループのStatusカラムカウントする:

:私は、次のコードを作成し、テストのために

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