我了解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
如果可以实现,请给我一些指针。 提前谢谢。
答案 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;
答案 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;