1

私はこのような値の表を持っています

978412, 400
978813, 20
978834, 50
981001, 20

ご覧のとおり、最初の番号に追加された2番目の番号は、シーケンスの次の番号の1つ前です。最後の数値は範囲内にありません(次の値のように、直接のシーケンスには従いません)。私が必要としているのは、これを出力するCTE(はい、理想的には)です

978412, 472
981001, 20

最初の行には、範囲の開始番号が含まれ、次にその中のノードの合計が含まれます。次の行は次の範囲であり、この例では元のデータと同じです。

4

2 に答える 2

2

Joshが投稿した記事から、これが私の見解です(テスト済みで動作中):

SELECT
    MAX(t1.gapID) as gapID,
    t2.gapID-MAX(t1.gapID)+t2.gapSize as gapSize
    -- max(t1) is the specific lower bound of t2 because of the group by.
FROM
  ( -- t1 is the lower boundary of an island.
    SELECT gapID
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT *
        FROM gaps tbl2 
        WHERE tbl1.gapID = tbl2.gapID + tbl2.gapSize + 1
      )
  ) t1
  INNER JOIN ( -- t2 is the upper boundary of an island.
    SELECT gapID, gapSize
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT * FROM gaps tbl2 
        WHERE tbl2.gapID = tbl1.gapID + tbl1.gapSize + 1
      )
  ) t2 ON t1.gapID <= t2.gapID -- For all t1, we get all bigger t2 and opposite.
GROUP BY t2.gapID, t2.gapSize
于 2009-01-23T14:58:43.813 に答える
0

このMSDN の記事を確認してください。持っているデータの量とクエリのパフォーマンス要件に応じて機能する場合は、問題の解決策を提供します。

編集:

クエリの例をうまく使用し、島を取得する 2 番目の方法 (最初の方法では SQL 2005 でエラーが発生しました) の最後のソリューションを使用します。

SELECT MIN(start) AS  startGroup, endGroup, (endgroup-min(start) +1) as NumNodes
FROM (SELECT g1.gapID AS start,
(SELECT min(g2.gapID) FROM #gaps g2 
WHERE g2.gapID >= g1.gapID and NOT EXISTS
(SELECT * FROM #gaps g3 
WHERE g3.gapID - g2.gapID = 1)) as endGroup
FROM #gaps g1) T1 GROUP BY endGroup

追加したのは(endgroup-min(start) +1) as NumNodes. これにより、カウントが得られます。

于 2009-01-23T13:50:18.863 に答える