2

以下の数字のシーケンスがあり、次の数字が前の値と 1 単位以上の差があるたびに新しいグループの数字を作成したい、つまり、連続間隔を壊したい

タブレット

value
1 
2
3
5
6
7
15
16
17
18

連続間隔で形成されるグループ:

min max
1   3
5   7
15  18

以下の例のように、dense_rank() 関数を使用して行に番号を付けようとしています。次に、rankNumber でグループ化し、MIN(値) と MAX(値) を取得できますが、使用するパターンが見つかりません。この関数の PARTITION BY 句

value rankNumber
1     1
2     1
3     1
5     2
6     2
7     2
15    3
16    3
17    3
18    3

    WITH T2 AS
    (
     SELECT value, LEAD(value) OVER(ORDER BY value) as nextValue
     FROM T 
    )

    SELECT value, DENSE_RANK() 
     OVER(PARTITION BY CASE WHEN nextValue - value > 1 THEN 1 ELSE 0 END ORDER BY value)
    FROM T2

テーブルを作成するコード:

CREATE TABLE t(
    value   INT
);
INSERT INTO t VALUES
    (1), (2), (3), (5), (6), (7), (15), (16), (17), (18);

上記のクエリを使用した現在の出力:

value rankNumber
1     1
2     2
3     1
5     3
6     4
7     2
15    5
16    6
17    7
18    8
4

1 に答える 1

7

シーケンスを対応するグループに変換する方法を考える必要があります。ここで別のユーザーからこのトリックを学びました。ROW_NUMBERすべてのレコードを通過する を使用するとvalue、その行番号から同じレコードの を引いてグループ キーを計算できます。が連続している場合values、減算結果に変化はありません (したがって、同じグループ キーが生成されます)。それ以外の場合、グループ キーは次の (より小さい) 値にジャンプします。ジャンプするたびに、グループ キーが小さくなります。

クエリは次のとおりです。

select min(value) min, max(value) max
from (select value, ROW_NUMBER() over (order by value) - value as [key] 
      from t) v
group by [key]
order by min
于 2016-04-30T10:03:05.707 に答える