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

标签 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   

i did trying it with but the problem which i faced is in case

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 中,从连接这两个查询中获取数据需要很长时间。

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

最佳答案

假设一个简单的表结构,例如:

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

关于sql - 如何使用pl/sql查找连续序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475667/

相关文章:

mysql - 如何从数据库中选择高于确切数字的数据

c# - linq to sql事务

mysql - 更改 MySQL 表中的多个值

sql - 如何确定字符串是否为 SQL 中的数字?

java - 数据库选择语句的并发问题

java - Io异常: The Network Adapter could not establish the connection

php - 如何使用 codeigniter 3 中的 dbforge 类在时间戳字段中设置更新属性

mysql - 在系统sql表中查找一次性用户

sql - 连接到没有范围但需要范围的表

oracle - Oracle异常处理-这正确吗?