2

我是一名 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 中,从加入这两个查询中获取数据需要很长时间。

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

4

1 回答 1

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;

SQL Fiddle 示例

于 2013-01-23T09:39:42.510 回答