如何编写SQL查询筛选右列timestamp早于前一行值的对应行?
可用查询语句实现方案
你可以使用SQL窗口函数LAG实现需求,该语法适配MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数主流数据库,写法如下:
WITH data_with_prev AS ( SELECT *, -- 按左侧排序列取上一行的timestamp值 LAG(右侧时间戳列名) OVER (ORDER BY 左侧排序列名) AS prev_row_timestamp FROM 你的表名 ) SELECT * FROM data_with_prev WHERE 右侧时间戳列名 < prev_row_timestamp;
你使用时替换三处占位符即可:
- 替换
你的表名为实际的表名称 - 替换
左侧排序列名为你提到的已经完成升序排序的左侧列的实际名称 - 替换
右侧时间戳列名为你要校验的timestamp列的实际名称
如果你使用的是不支持窗口函数的低版本数据库(如MySQL 5.7及更早版本),可以用自关联的写法实现同等效果:
SELECT curr.* FROM 你的表名 curr INNER JOIN 你的表名 prev ON prev.左侧排序列名 = (SELECT MAX(左侧排序列名) FROM 你的表名 WHERE 左侧排序列名 < curr.左侧排序列名) WHERE curr.右侧时间戳列名 < prev.右侧时间戳列名;
内容的提问来源于stack exchange,提问作者user17429869
相关产品推荐
相关产品推荐

