Oracle查询显示计数和开始,序列结束

时间:2018-05-11 13:36:15

标签: sql oracle

我了解Oracle的基础知识,而且我是一名java开发人员,我可以通过获取数据并迭代它来在java中执行以下操作/任务。但我想知道有没有办法显示序列的开始和结束以及使用SQL(Oracle)查询在开始和结束之间的差异。

假设我有一个表格TB1,其中包含一些包含一些序列号的列seq

 SEQ
------
1
2
3
7
8
9
14
19
20

有没有办法按如下方式显示序列开始,结束和计数。

Start  | end | count
---------------------
1        3     3
7        9     3
14       14    1
19       20    2   

如果可以实现,请给我一些指针。 提前谢谢。

3 个答案:

答案 0 :(得分:4)

是。您可以使用TABIBITOSAN方法轻松完成。

SELECT MIN(seq)
    ,MAX(seq)
    ,count(*)
FROM (
    SELECT seq
        ,seq - row_number() OVER (
            ORDER BY seq
            ) grp
    FROM t
    )
GROUP BY grp
ORDER BY 1;

Demo

答案 1 :(得分:0)

您应该编写一个过程,并通过游标循环。保留三个临时变量,只要seq中有中断(确保在Seq列上执行Order by),并将start,end和count插入到其他表中。

查看可能对您有所帮助的类似example

答案 2 :(得分:0)

SQL> WITH cte_table (seq) AS (
  2    SELECT 1 FROM dual UNION ALL
  3    SELECT 2 FROM dual UNION ALL
  4    SELECT 3 FROM dual UNION ALL
  5    SELECT 7 FROM dual UNION ALL
  6    SELECT 8 FROM dual UNION ALL
  7    SELECT 9 FROM dual UNION ALL
  8    SELECT 14 FROM dual UNION ALL
  9    SELECT 19 FROM dual UNION ALL
 10    SELECT 20 FROM dual),
 11  table_ AS (
 12  SELECT seq, seq - row_number() OVER (ORDER BY seq) grp FROM cte_table)
 13  SELECT MIN(seq) "START",
 14         MAX(seq) "END",
 15         COUNT(*) "COUNT"
 16    FROM table_
 17   GROUP BY grp
 18   ORDER BY 1;

输出:

     START        END      COUNT
---------- ---------- ----------
         1          3          3
         7          9          3
        14         14          1
        19         20          2

使用您的表格,查询将是

WITH table_ AS (
  SELECT seq, seq - row_number() OVER (ORDER BY seq) grp FROM tb1) 
SELECT MIN(seq) "START",
       MAX(seq) "END",
       COUNT(*) "COUNT"
  FROM table_
 GROUP BY grp
 ORDER BY 1;