SQL 局部最小值和最大值

标签 sql oracle gaps-and-islands

我有这些数据:

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 用户,但我从未解决过这个问题。显然,我知道如何使用 GROUPMINMAX 获取每种 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/

相关文章:

sql - Oracle 相当于 Postgres 的 DISTINCT ON?

sql - 从 plsql 输出/返回的 CLOB 值(指定的 LOB 定位器无效 : ORA-22275)

SQL 计算日期范围内的连续天数

mysql - 为什么即使表中不存在该列,sql 也会给出结果?

java - hibernate 中不区分大小写的搜索

sql - 如何使用sql从日期字段按月分组

php - 来自两个表的 COUNT 和 SELECT 查询

java - 如何转换日期忽略 ORA-01847 错误 月份的日期必须介于 1 和月份的最后一天之间

database - 让 Postgres 选择下一个最小的可用 id

mysql - 检查连续 x 天 - 给定数据库中的时间戳