2013-01-23 15 views
2

我是一个PL/SQL程序员和面临的一系列发现连续性同日 假设我有一系列类似如何找到使用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的记录中,需要很长时间才能从加入这两个查询中获取数据。

请让我以正确的时间间隔排列数据的适当方法。

回答

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

+0

其工作....非常感谢..... –

+1

@DharmeshPorwal,哟你应该接受合适的答案[如何问?](http://stackoverflow.com/faq#howtoask) – glh

+0

这个答案太神奇了!这很简单,但仍然设法让我的大脑! – glh