我有这些数据:
row_id type value
1 a 1
2 a 2
3 a 3
4 a 5 --note that type a, value 4 is missing
5 a 6
6 a 7
7 b 1
8 b 2
9 b 3
10 b 4
11 b 5 --note that type b is missing no values from 1 to 5
12 c 1
13 c 3 --note that type c, value 2 is missing
我想找到每个类型
中每次连续“运行”的最小值和最大值。也就是我要返回
row_id type group_num min_value max_value
1 a 1 1 3
2 a 2 5 7
3 b 1 1 5
4 c 1 1 1
5 c 2 3 3
我是一个相当有经验的 SQL 用户,但我从未解决过这个问题。显然,我知道如何使用 GROUP
、MIN
和 MAX
获取每种 type
的总体最小值和最大值,但我真的对这些局部最小值和最大值感到不知所措。我在其他问题上没有找到任何可以回答我的问题的内容。
我正在将 PLSQL Developer 与 Oracle 11g 结合使用。谢谢!
最佳答案
这是一个间隙和岛屿问题。您可以使用an analytic function effect/trick查找每种类型的连续值链:
select type,
min(value) as min_value,
max(value) as max_value
from (
select type, value,
dense_rank() over (partition by type order by value)
- dense_rank() over (partition by null order by value) as chain
from your_table
)
group by type, chain
order by type, min(value);
内部查询使用类型内值的排名与整个结果集中值的排名之间的差异来创建“链”数字。外部查询仅使用它进行分组。
SQL Fiddle包括内部查询的结果。
关于SQL 局部最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920248/