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>