2

私は pl/sql プログラマであり、同じ日付のシリーズの連続性を見つける際に問題に直面しています。次のようなシリーズがあるとします。

1000,1001, 1002,1003, 1004,1005, 1016,1017, 1018,1019, 1020,1021, 1035,1036, 1037,1038, 1039,1040

そして、私は出力を探しています

from_series ------------- to_series
      1000 ------------- 1005
      1016 ------------- 1021
      1035 ------------- 1040   

私はそれを試してみましたが、私が直面した問題は

SELECT *
FROM  retort_t r
where NOT EXISTS
        (
        SELECT  'X'
        FROM    retort_t
        r.series_NO-ISSUE_NO=1 );

SELECT *
FROM  retort_t r
where NOT EXISTS
        (
        SELECT  'X'
        FROM    retort_t
        ISSUE_NO=r.series_NO+1 );

上記の 2 つのクエリを並べて結合することで、結果を取得しています。レコードが少ない場合は問題ありませんが、私のレコードは lac にあり、これら 2 つのクエリを結合してデータを取得するのに時間がかかります。

データを正しい間隔で並べ替える適切な方法を教えてください。

4

1 に答える 1

2

次のような単純なテーブル構造を想定しています。

CREATE TABLE T (x INT);
INSERT INTO T (x) VALUES 
    (1000), (1001), (1002), (1003), 
    (1004), (1005), (1016), (1017), 
    (1018), (1019), (1020), (1021), 
    (1035), (1036), (1037), (1038), 
    (1039), (1040);

ROW_NUMBER()を使用して連続番号の静的な値を取得し、この値でグループ化して、次の範囲の最小値と最大値を取得できます。

SELECT  MIN(x) AS RangeStart, MAX(x) AS RangeEnd
FROM    (   SELECT  X,
                    X - ROW_NUMBER() OVER(ORDER BY x) AS GroupBy
            FROM    T
        ) t
GROUP BY GroupBy;

SQLフィドルの例

于 2013-01-23T09:39:42.510 に答える