sql >> データベース >  >> RDS >> Sqlserver

列の値に基づいて連続する行を見つける方法は?

    これを試してください

    WITH cte
    AS
    (
        SELECT *,COUNT(1) OVER(PARTITION BY cnt) pt  FROM
        (
            SELECT tt.*
               ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
            FROM  t tt
            WHERE data > 10
        ) t1
    )
    
    SELECT id, [when], data FROM cte WHERE pt >= 3
    

    SQLフィドルデモ

    出力

    id  when                    data
    2   2013-08-02 00:00:00.000 121
    3   2013-08-03 00:00:00.000 132
    4   2013-08-04 00:00:00.000 15
    6   2013-08-06 00:00:00.000 1435
    7   2013-08-07 00:00:00.000 143
    8   2013-08-08 00:00:00.000 18
    9   2013-08-09 00:00:00.000 19
    

    編集

    最初に、内部クエリはデータが<=10

    であるレコードの数をカウントします
    SELECT tt.*
         ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
    FROM  t tt
    

    出力

    id  when                    data   cnt
    1   2013-08-01 00:00:00.000 1       1
    2   2013-08-02 00:00:00.000 121     1
    3   2013-08-03 00:00:00.000 132     1
    4   2013-08-04 00:00:00.000 15      1
    5   2013-08-05 00:00:00.000 9       2
    6   2013-08-06 00:00:00.000 1435    2
    7   2013-08-07 00:00:00.000 143     2
    8   2013-08-08 00:00:00.000 18      2
    9   2013-08-09 00:00:00.000 19      2
    10  2013-08-10 00:00:00.000 1       3
    11  2013-08-11 00:00:00.000 1234    3
    12  2013-08-12 00:00:00.000 124     3
    13  2013-08-13 00:00:00.000 6       4
    

    次に、データが10を超えるレコードをフィルタリングします

    WHERE data > 10
    

    ここで、cnt列を分割してレコードをカウントします

    SELECT *,COUNT(1) OVER(PARTITION BY cnt) pt  FROM
    (
        SELECT tt.*
            ,(SELECT COUNT(id) FROM t WHERE data <= 10 AND ID < tt.ID) AS cnt
        FROM  t tt
        WHERE data > 10
    ) t1
    

    出力

    id  when    data                   cnt  pt
    2   2013-08-02 00:00:00.000 121     1   3
    3   2013-08-03 00:00:00.000 132     1   3
    4   2013-08-04 00:00:00.000 15      1   3
    6   2013-08-06 00:00:00.000 1435    2   4
    7   2013-08-07 00:00:00.000 143     2   4
    8   2013-08-08 00:00:00.000 18      2   4
    9   2013-08-09 00:00:00.000 19      2   4
    11  2013-08-11 00:00:00.000 1234    3   2
    12  2013-08-12 00:00:00.000 124     3   2
    

    上記のクエリは、一時テーブルと同じようにcteに配置されます

    次に、連続カウント> =3

    のレコードを選択します。
    SELECT id, [when], data FROM cte WHERE pt >= 3
    

    別の解決策

    ;WITH partitioned AS (
      SELECT *, id - ROW_NUMBER() OVER (ORDER BY id) AS grp
      FROM t
      WHERE data > 10
    ),
    counted AS (
      SELECT *, COUNT(*) OVER (PARTITION BY grp) AS cnt
      FROM partitioned
    )
    
    SELECT id, [when], data
    FROM counted
    WHERE cnt >= 3
    

    参照URL

    SQLフィドルデモ



    1. LOWER()がMariaDBでどのように機能するか

    2. MariaDB ROWNUM()の説明

    3. SQLServerのテーブルにあるすべての外部キーを一覧表示する

    4. PostgreSQLはWHERE句で列エイリアスを受け入れません