0

次の形式のテーブルがあります。

 cId    seq 
 ---    --- 
 A      1
 A      2
 A      4
 A      5
 B      8
 B      9
 A      12
 A      13

次のような別のテーブルを生成するクエリを作成したいと思います。

 cId    seq    consecutive
 ---    ---    -----------
 A      1      1
 A      2      1
 A      4      2
 A      5      2
 B      8      3
 B      9      3
 A      12     4
 A      13     4

私がやろうとしているのは、同じ cId を持つ連続した seq 値を識別し、それらに番号を付けることです。

Lag 関数を使用して前の seq 値を決定し、連続する列を設定することを考えていましたが、次のブレークに遭遇したときに値をインクリメントする方法がわかりません。

SELECT [cId], 
       [Seq],
       CASE WHEN [Seq] - 1 = LAG([Seq], 1, [Seq]) OVER ( ORDER BY [Seq])  THEN 1 
       ELSE 2 END as consecutive
FROM #ConsecutiveData

このクエリは、各シーケンスの開始の隣に 2 を置きます。それは私が来た最も近いものです。

4

1 に答える 1

3

私の知る限り、MySQL にはLAG機能がないので、著者は MySQL を使用していないと思います。

以下は、MSSQL の可能な解決策です。

SELECT
    cid,
    seq,
    DENSE_RANK() OVER (ORDER BY seq - row_num) consecutive
  FROM (
    SELECT
        cid,
        seq,
        ROW_NUMBER() OVER (ORDER BY seq) row_num
      FROM
        test_table
  ) data
;

SQLFiddle で確認します。SQLFiddle Example

于 2013-11-06T23:44:33.250 に答える