首页 > 解决方案 > 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);

标签: mysqlsql

解决方案


在 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

推荐阅读