Значения диапазона группы SQL - PullRequest
1 голос
/ 10 июня 2011

Я посмотрел на несколько других вопросов / ответов здесь, но я не могу применить их к моей проблеме. Я пытаюсь определить несколько последовательных разрывов на основе ключевого столбца. Большинство примеров, которые я нашел, не имеют дело с несколькими разрывами в последовательности для одного и того же ключевого столбца.

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

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Это относительно переносимое решение SQL, поскольку вы не указали DB

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 и более поздних версиях, вам следует искать фразу " Ицик Бен-Ганразрывы и острова"

0 голосов
/ 10 июня 2011

Что ж, если вы используете СУБД, которая поддерживает функцию lag (), то это должно сказать вам, где находятся разрывы. Затем вы сможете использовать это вместе с некоторыми инструкциями 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...