1

ここで他のいくつかの質問/回答を見てきましたが、それらを私の問題に適用することはできません. キー列に基づいて複数のシーケンシャル ブレークを識別しようとしています。私が見つけたほとんどの例は、同じキー列のシーケンスで複数のブレークを処理していません。

Sample data:
Location     Number
------------------------
300          15
300          16
300          17
300          18
300          21
300          22
300          23
400          10
400          11
400          14
400          16

Here is the result I am looking for:
Location     StartNumber    StartNumber
------------------------------------------
300                   15             18
300                   21             23
400                   10             11
400                   14             14
400                   16             16
4

2 に答える 2

2

DBを指定しなかったため、これは比較的移植性の高いSQLソリューションです。

Create Table  SampleData  (Location int, Number Int)
INSERT INTO SampleData VALUES (300, 15)
INSERT INTO SampleData VALUES (300, 16)
INSERT INTO SampleData VALUES (300, 17)
INSERT INTO SampleData VALUES (300, 18)
INSERT INTO SampleData VALUES (300, 21)
INSERT INTO SampleData VALUES (300, 22)
INSERT INTO SampleData VALUES (300, 23)
INSERT INTO SampleData VALUES (400, 10)
INSERT INTO SampleData VALUES (400, 11)
INSERT INTO SampleData VALUES (400, 14)
INSERT INTO SampleData VALUES (400, 16)



SELECT 
        t1.Location,
        t1.Number      AS startofgroup, 
       MIN(t2.Number) AS endofgroup 
FROM   (SELECT Number , Location
        FROM   SampleData tbl1 
        WHERE  NOT EXISTS(SELECT * 
                          FROM   SampleData tbl2 
                          WHERE  tbl1.Number - tbl2.Number = 1
                                 and tbl1.Location = tbl2.Location)) t1 
       INNER JOIN (SELECT Number , Location
                   FROM   SampleData tbl1 
                   WHERE  NOT EXISTS(SELECT * 
                                     FROM   SampleData tbl2 
                                     WHERE  tbl2.Number - tbl1.Number = 1
                                     and tbl1.Location = tbl2.Location)) t2 
         ON t1.Number <= t2.Number 
            and t1.Location = t2.Location
GROUP  BY 
    t1.Location,
    t1.Number 
ORDER BY 
   Location,
   startofgroup

出力

Location    startofgroup endofgroup
----------- ------------ -----------
300         15           18
300         21           23
400         10           11
400         14           14
400         16           16

リスト2の修正版。島を識別するためのセットベースのソリューション。アレクサンダーコザックによる連続番号の島とギャップから

SQL Server 2005以降でさらに多くのオプションを探している場合は、「ItzikBen-Ganのギャップと島」というフレーズを検索する必要があります。

于 2011-06-10T17:01:33.540 に答える
0

そうですね、lag() 関数をサポートする RDBMS を使用している場合は、これでどこが壊れているかがわかります。次に、これをいくつかの case ステートメントと一緒に使用し、min() および max() 関数を慎重に使用して、必要なクエリを取得できるようにする必要があります。

select location, lag_number as startnumber, number as endnumber
from(select location, number, lag_number
from(
    select location, number
    , lag(number) over (partition by location order by number) as lag_number
    from table
    )a
    where number is not null and lag_number is not null
)b
where number-lag_number>1 order by 1,2,3;
于 2011-06-10T16:46:34.760 に答える