1

この表の島を下に表示したい:

Group    MemberNo
A           100
A           101
A           200
A           201
A           202
A           203
X           100
X           101
A           204
X           301
X           302
A           500
A           600

SQL(島)を使用してこの結果を取得したい:

Group  FromMemberNo      ToMemberNo
A             100             101
A             200             204
X             100             101
X             301             302
A             500             500
A             600             600

私はこれについて多くのコード/フォーラムを見てきましたが、SQLiteにはCTEがないため、SQLiteでは機能しません。

100-101は連続しているため、1つにグループ化されます。

誰かがSQLiteでそれを行う方法を知っていますか?

4

1 に答える 1

1

これを行う最も速い方法は、このテーブルの順序付けられたレコードをループで調べ、島を手動で収集することです。

純粋なSQL(セット指向言語として)では、これはそれほど簡単ではありません。

まず、島で最初のレコードを見つけます。最初のレコードには前のレコードがありません。つまり、同じグループであるがMemberNo1つ小さいレコードです。

SELECT "Group",
       MemberNo AS FromMemberNo
FROM ThisTable AS t1
WHERE NOT EXISTS (SELECT 1
                  FROM ThisTable AS t2
                  WHERE t2."Group" = t1."Group"
                    AND t2.MemberNo = t1.MemberNo - 1)

島の最後のレコードを見つけるにはMemberNo、同じ島にまだ属している、つまり同じグループを持ち、MemberNo島内のすべてのが連続している最大のレコードを見つける必要があります。MemberNo最初のレコードと最後のレコードの値の差を計算することにより、連続したsを検出します。MemberNoグループのある島の最後Gと最初の島は、次のMemberNo Mように計算できます。

SELECT MAX(MemberNo) AS LastMemberNo
FROM ThisTable AS t3
WHERE t3."Group" = G
  AND t3.MemberNo - M + 1 = (SELECT COUNT(*)
                             FROM ThisTable AS t4
                             WHERE t4."Group" = G
                               AND t4.MemberNo BETWEEN M AND t3.MemberNo)

最後に、これを最初のクエリにプラグインします。

SELECT "Group",
       MemberNo AS FromMemberNo,
       (SELECT MAX(MemberNo)
        FROM ThisTable AS t3
        WHERE t3."Group" = t1."Group"
          AND t3.MemberNo - t1.MemberNo + 1 = (SELECT COUNT(*)
                                               FROM ThisTable AS t4
                                               WHERE t4."Group" = t1."Group"
                                                 AND t4.MemberNo BETWEEN t1.MemberNo AND t3.MemberNo)
       ) AS LastMemberNo
FROM ThisTable AS t1
WHERE NOT EXISTS (SELECT 1
                  FROM ThisTable AS t2
                  WHERE t2."Group" = t1."Group"
                    AND t2.MemberNo = t1.MemberNo - 1)
于 2013-03-27T08:22:00.090 に答える