Sql 如何在oracle select查询中获取更改点?
如何从该数据集中选择变更点Sql 如何在oracle select查询中获取更改点?,sql,oracle,max,min,row-number,Sql,Oracle,Max,Min,Row Number,如何从该数据集中选择变更点 1 0 2 0 3 0 4 100 5 100 6 100 7 100 8 0 9 0 10 0 11 100 12 100 13 0 14 0 15 0 我想要这个结果 4 7 100 11 12 100 基于分析函数lag和lead的查询给出了预期输出: select id, nid, point from ( select id, point, p1, lead(id) over (orde
1 0
2 0
3 0
4 100
5 100
6 100
7 100
8 0
9 0
10 0
11 100
12 100
13 0
14 0
15 0
我想要这个结果
4 7 100
11 12 100
基于分析函数lag和lead的查询给出了预期输出:
select id, nid, point
from (
select id, point, p1, lead(id) over (order by id) nid
from (
select id, point,
decode(lag(point) over (order by id), point, 0, 1) p1,
decode(lead(point) over (order by id), point, 0, 2) p2
from test)
where p1<>0 or p2<>0)
where p1=1 and point<>0
使用行数分析函数MIN和MAX会很简单
这是一个关于查找值的间隔/系列并跳过间隙的常见问题。我喜欢Aketi Jyuzu给它的词
比如说,
SQL> SELECT MIN(A),
2 MAX(A),
3 b
4 FROM
5 ( SELECT a,b, a-Row_Number() over(order by a) AS rn FROM t WHERE b <> 0
6 )
7 GROUP BY rn,
8 b
9 ORDER BY MIN(a);
MIN(A) MAX(A) B
---------- ---------- ----------
4 7 100
11 12 100
SQL>
就我个人而言,我会用plsql来实现这一点,创建一个按col1排序的游标,存储col2的值,将col2的值与循环中每次传递的存储值进行比较。然后,可以在发生更改时存储col1值。但是,如果您想在SQL中实现这一点,其他人可能会提供帮助。为什么不在PL/SQL中实现13 0、8 10 0和13 15 0呢?@davegreen100永远不会在纯SQL中实现这一点。@Lalit,除非您希望在批处理过程中重复代码。在这个问题上,我倾向于使用PL/SQL,因为我不知道如何使用它SQL@davegreen100如果您知道如何使用分析和聚合函数,那么它就是一个简单的SQL。看看我的答案。
SQL> SELECT MIN(A),
2 MAX(A),
3 b
4 FROM
5 ( SELECT a,b, a-Row_Number() over(order by a) AS rn FROM t WHERE b <> 0
6 )
7 GROUP BY rn,
8 b
9 ORDER BY MIN(a);
MIN(A) MAX(A) B
---------- ---------- ----------
4 7 100
11 12 100
SQL>