Найти строки с последовательными - PullRequest
0 голосов
/ 10 июля 2019

У меня есть два целочисленных столбца, и в столбце NUM необходимо отобразить строки с последовательными.

Пример данных :

CREATE TABLE table_name ( ID, NUM ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 3, 1 FROM DUAL UNION ALL
SELECT 4, 2 FROM DUAL UNION ALL
SELECT 5, 1 FROM DUAL UNION ALL
SELECT 6, 2 FROM DUAL UNION ALL
SELECT 7, 2 FROM DUAL;

Ожидаемый результат :

ID  NUM
--  ---
 1    1
 2    1
 3    1

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Используйте аналитические функции LAG или LEAD:

Oracle Setup :

CREATE TABLE table_name ( ID, NUM ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 3, 1 FROM DUAL UNION ALL
SELECT 4, 2 FROM DUAL UNION ALL
SELECT 5, 1 FROM DUAL UNION ALL
SELECT 6, 2 FROM DUAL UNION ALL
SELECT 7, 2 FROM DUAL;

Запрос :

SELECT id,num
FROM   (
  SELECT id,
         num,
         LAG(  num ) OVER ( ORDER BY id ) AS prev_num,
         LEAD( num ) OVER ( ORDER BY id ) AS next_num
  FROM   table_name
)
WHERE num = 1
AND   (  num = prev_num
      OR num = next_num )

Выход :

ID | NUM
-: | --:
 1 |   1
 2 |   1
 3 |   1

дБ <> скрипка здесь

0 голосов
/ 10 июля 2019

Я пытался использовать самостоятельные соединения и добился результата:

WITH TAB (ID, NUM) AS
(
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 3, 1 FROM DUAL UNION ALL
SELECT 4, 2 FROM DUAL UNION ALL
SELECT 5, 1 FROM DUAL UNION ALL
SELECT 6, 2 FROM DUAL UNION ALL
SELECT 7, 2 FROM DUAL
)
SELECT DISTINCT
    T.ID,
    T.NUM
FROM
    TAB T
    JOIN (
        SELECT
            T1.ID   ID1,
            T2.ID   ID2,
            T1.NUM,
            COUNT(1) OVER(
                PARTITION BY T1.NUM
            ) RN
        FROM
            TAB T1
            JOIN TAB T2 ON ( T1.NUM = T2.NUM
                             AND T1.ID = T2.ID + 1 )
    ) T_IN ON ( ( T.ID = T_IN.ID1
                  OR T.ID = T_IN.ID2 )
                AND T.NUM = T_IN.NUM
                AND RN >= 2 ) -- THIS CONDITION IS TO RESTRICT CONSECUTIVES LESS THAN 3
ORDER BY
    1

выход:

enter image description here

db <> демо fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...