mysql - MYSQL 函数根据列的连续值返回记录
问题描述
如何编写 MYSQL 函数以根据列的连续值(int 或日期或时间戳)返回记录。
例如:<br>
// id连续4次记录,id : 5,6,7,8
select * from employee where consecutive(id,4);
//日期连续4个日期记录
select * from employee where consecutive(date,4);
//只要id是连续的,就全部返回。
select * from employee where consecutive (date,null);
解决方案
在 ISO 标准 SQL 2003 或更高版本中,我将ROW_NUMBER() OVER ( ORDER BY id )
结合使用OFFSET
. 此查询适用于 SQL Server 2012 或更高版本、Oracle 10g 或更高版本、PostgreSQL 或MySQL 8 或更高版本- 但几乎没有人运行 MySQL 8...
对于您的第一个示例:
SELECT
employee.*
FROM
(
SELECT
id,
ROW_NUMBER() OVER ( ORDER BY id ) AS rn
FROM
employee
) AS sq
INNER JOIN employee ON employee.id = sq.id
ORDER BY
id
OFFSET
0 ROWS FETCH 4
幸运的是,MySQL 允许您在 a 中增加变量并评估其他不纯的表达式,SELECT
就好像它们被迭代评估一样(这是在“SQL 思维方式”中做出的错误假设)。
所以这是一个在 MySQL 中使用内联初始化获得行排名的技巧:
SELECT
*,
@rank := @rank + 1 AS rn
FROM
employee,
( SELECT @rank := 0 )
ORDER BY
employee.id
所以我们可以使用它作为我们的子查询:
SELECT
employee.*
FROM
(
SELECT
employee.id,
@rank := @rank + 1 AS rn
FROM
employee,
( SELECT @rank := 0 )
ORDER BY
employee.id
) AS sq
INNER JOIN employee ON employee.id = sq.id
ORDER BY
id
LIMIT
4 OFFSET 0
推荐阅读
- css - 将鼠标悬停在自定义 CSS 复选框上时添加过渡效果
- python - 从数据框中的列中删除值
- python - 对于我来说,枚举(trainloader)中的数据需要很长时间才能执行
- couchbase - 使用 CBQ 控制台更新 couchbase 文档中的对象
- sed - 如何编写完整的“sed”命令
- html - 在@media 函数(css)中更改文本大小
- json - 找不到入口模块:错误:运行 webpack 时无法解析 './src --stats=detailed --json > compilation-stats.json
- c++ - 分段错误:核心转储 C++ 字符串
- .net - Prism WPF - Prism.Ioc.ContainerResolutionException:无法加载文件或程序集'System.Runtime.CompilerServices.Unsafe
- ios - 在越狱的 arm64e iOS 设备上获取嵌入式 Sim 的 IMEI