在无符号整数的索引列中考虑以下值:

1
2
3
3
2
4
6
8
9

对于提供的任何数字,我希望获得其连续范围内的最大值(在下一个连续数字存在时继续前进).

例如,假设我们的输入为234的连续值确实存在于列表中(无论其顺序如何),但5不存在;因此,我们的连续范围将是2,3,4;因此,预期值为4:这一连续范围内的最大值;提供了134中的任何一种,也应产生4.因此:

input           expected output
-------------------------------
1,2,3,4                       4  -- any value of the input yields 4
5                             5  -- the input value doesn't even exist in the list
6                             6  -- it's the only value
7                             7  -- the input value doesn't even exist in the list
8,9                           9

那么,如何使用MySQL在任何连续范围内获得最大值呢?

推荐答案

使用递归CTE:

WITH RECURSIVE cte AS (
  SELECT x FROM tablename WHERE x = ?
  UNION 
  SELECT t.x
  FROM tablename t INNER JOIN cte c
  ON t.x = c.x + 1
)
SELECT COALESCE(MAX(x), ?) x FROM cte;

See the demo.

或者,使用DENSE_RANK()窗口功能:

SELECT COALESCE(MAX(CASE WHEN x = rn THEN x END), ?) x
FROM (
  SELECT x, DENSE_RANK() OVER (ORDER BY x) + ? rn
  FROM tablename
  WHERE x > ? AND EXISTS (SELECT * FROM tablename WHERE x = ?)
) t

See the demo.

Replace ? with the input value that you want.

Mysql相关问答推荐

SQL - Select 复合主键,条件为其中一个主键

奇怪的MySQL SELECT循环;但不是\G

如何合并有多行的json列

仅获取我不是最后一个 comments 者的博客帖子

亚马逊RDS MySQL-无法';t执行';使用读取锁定刷新表';

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

使用 presto 或 mysql 添加每个组中的缺失值

将上传文件的存储路径放在一张表中的缺点是什么?

如何将数据导入MySQL中的master/replica struct

Group By 查询运行速度太慢而无法正常运行

为什么 `count` 函数有效但 `sum` 无效?

Mysql Pivot 查询/建议

Django中的MYSQL查询等效

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

如何使用 SQL 聚合和求和相似 Select 的值?

提高mysql导入速度

MySQL:按字段排序,将空单元格放在末尾

MySQL 整数与日期时间索引

MySQL与空值比较

将 UTF8 表上的 latin1 字符转换为 UTF8