0

私は完全に解決できないこの問題を抱えています。欠落している数の間隔を取得できますが、それらをつなぎ合わせて連続シリーズに戻すことはできません。

したがって、シリーズが [1000,1001,1002,1003,1005,1006,1008] として定義されている場合、3 つの連続したシリーズ [1000,1001,1002,1003] および [1005,1006] および [1008] を抽出したいと考えています。 . 単純な CTE を使用して 1003、1005、1006、1008 を取得したので、間隔の終了と開始を取得できましたが、ではどうすればよいでしょうか。

最後に、次のようなテーブルが必要です。

|to   |from  |  
|1000 |1003  |  
|1005 |1006  |  
|1008 |1008  |

共有したいスマートなソリューションを持っている人はいますか?

編集:これは(おそらく冗長な)CTEです:

WITH MissingNumbers (FromNumber, ToNumber) AS
(   
SELECT 
    T1.TaxLabelNumber, 
    T2.TaxLabelNumber
FROM TaxLabel T1
JOIN TaxLabel T2
    ON T1.TaxLabelId + 1 = T2.TaxLabelId
WHERE T1.TaxLabelNumber <> T2.TaxLabelNumber - 1
)
SELECT * INTO #TempNumbers 
FROM MissingNumbers 

EDIT2:オフ。計画の変更があったので、この種のソリューションはもう必要ありません。にもかかわらず、すべての返信をありがとう! 非常に役に立ちました:D

4

3 に答える 3

0

これを試して

SELECT SSTART.num series_start, MIN(SEND.num) series_end
FROM   #series SSTART, #series SEND
WHERE
      /* anything that does not have a predecessor is a START */
      SSTART.num - 1 NOT IN (SELECT num FROM #series) AND
      /* anything that does not have a following entry is an END */
      SEND.num + 1 NOT IN (SELECT num FROM #series)   AND
      /* now join each START with every END above it */
      SEND.num >= SSTART.num
      /* we group over each START, so we can get the corresponding END with MIN */
GROUP BY SSTART.num
于 2009-09-14T09:32:04.490 に答える
0
WITH    data AS
        (
        SELECT  1000 AS number
        UNION ALL
        SELECT  1001
        UNION ALL
        SELECT  1002
        UNION ALL
        SELECT  1003
        UNION ALL
        SELECT  1005
        UNION ALL
        SELECT  1006
        UNION ALL
        SELECT  1008
        ),
        rows AS
        (
        SELECT  q2.number AS nnumber, q.number AS number
        FROM    (
                SELECT  number
                FROM    data di
                WHERE   NOT EXISTS
                        (
                        SELECT  NULL
                        FROM    data dn
                        WHERE   dn.number = di.number - 1
                        )
                ) q
                OUTER APPLY
                (
                SELECT  TOP 1 number
                FROM    data dp
                WHERE   dp.number < q.number
                ORDER BY
                        dp.number DESC
                ) q2
        UNION ALL
        SELECT  TOP 1 number, NULL
        FROM    data
        ORDER BY
                number DESC
        ),
        rns AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY nnumber) AS rn
        FROM    rows
        )
SELECT  re.number, rb.nnumber
FROM    rns re
JOIN    rns rb
ON      rb.rn = re.rn + 1
于 2009-09-14T09:34:46.620 に答える
0

簡単な方法は、外部結合を実行できるように、TaxLabelNumbers を含むテーブルを用意することです。

そのようなテーブルを CTE で作成することもできますが、あまり効率的ではありません。

with TaxLabelSeq( Number ) as  
(  
    select @FromNumber as Number  
        union all  
    select Number + 1  
        from NumberSequence  
        where Number < @ToNumber
)

CTE はデフォルトで 100 回の再帰を賢明に設定しているため、100 個を超える数が必要な場合はそれを増やす必要があります。

select * from TaxLabelSeq option (MaxRecursion 4711)
于 2009-09-14T09:18:49.017 に答える