查找连续的行

时间:2019-07-10 07:06:49

标签: sql oracle

我有两个整数列,需要在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 :(得分:0)

我尝试使用自连接并获得了结果:

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 demo

答案 1 :(得分:0)

使用分析功能LAGLEAD

Oracle设置

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

db <>提琴here