如何使用pl / sql查找连续序列

时间:2013-01-23 08:53:36

标签: sql oracle10g

我是一名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 );

我通过加入上述两个查询来获得结果。对于少数记录是可以的,但我的记录是在lac中,从连接这两个查询获取数据需要很长时间。

请让我以适当的方式按正确的时间间隔整理数据。

1 个答案:

答案 0 :(得分: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;

<强> Example On SQL Fiddle