2

これはテーブルの単純化されたビューです。申し訳ありませんが、テーブルの写真を保存できませんでした。これで問題ないことを願っています。

c1 ___c2
1 ____a
1 ____b
2 ____a
2 ____b
2 ____c
2 ____d
3 ____e
3 ____a
4 ____z
5 ____d

その結果、列 C2 の関係により、グループ 1 には 1,2,3,5 が含まれます (基本的に a=b=c=d=e を示す c2 値が重複しているため) グループ 2 には 4 が含まれます。

この種のデータを含む何百万もの行があり、現在、これらのグループを構築するために x 回実行するカーソル ジョブがあります。これがどのように機能するかを視覚化することはできますが、この関係を引き出せるクエリを構築することはできませんでした。助言がありますか?ありがとうございました

4

1 に答える 1

0

SQL Server 2012 でテスト済み:

WITH t AS (
    SELECT
        t.c1,
        t.c2,
        tm.c1_min
    FROM
        Test t
    JOIN
        (
            SELECT
                c2,
                MIN(c1) AS c1_min
            FROM
                Test
            GROUP BY
                c2
        ) AS tm
    ON
        t.c2 = tm.c2
),
rt AS (
    SELECT
        c1_min,
        c1,
        1 AS cnt
    FROM
        t
UNION ALL
    SELECT
        rt.c1_min,
        t.c1,
        rt.cnt + 1 AS cnt
    FROM
        rt
    JOIN
        t
    ON
        rt.c1 = t.c1_min
    AND
        rt.c1 < t.c1
)
SELECT
    SUM(t.rst) OVER (ORDER BY t.ord ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_number,
    t.c1
FROM
    (
        SELECT
            t.c1,
            t.rst,
            t.ord
        FROM
            (
                SELECT
                    rt.c1,
                    CASE
                        WHEN rt.c1_min = MIN(rt.c1_min) OVER (ORDER BY rt.c1_min, rt.c1 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) THEN 0
                        ELSE 1
                    END AS rst,
                    ROW_NUMBER() OVER (ORDER BY rt.c1_min, rt.c1) AS ord,
                    ROW_NUMBER() OVER (PARTITION BY rt.c1 ORDER BY rt.c1_min, rt.cnt) AS qfy
                FROM
                    rt
            ) AS t
        WHERE
            t.qfy = 1
    ) AS t;
于 2013-11-09T16:23:25.360 に答える