MariaDB/MySQL使用子查询实现Device表安装时间区间查询问题
最优解法(支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、SQL Server等)
你要实现的是取同设备下一条记录的安装日期,直接用SQL标准窗口函数LEAD即可实现,代码如下:
SELECT DeviceName, Installed AS InstalledFrom, LEAD(Installed) OVER (PARTITION BY DeviceName ORDER BY Installed) AS InstalledTo, Customer FROM Device ORDER BY DeviceName, Installed;
LEAD函数的作用就是取当前分组排序后,下一行对应的字段值,没有下一行时默认返回NULL,完全匹配你的需求。
原有SQL的问题
你写的关联条件逻辑错误:子查询返回的是符合条件的设备名,关联条件只限制了b.DeviceName和a同设备,没有限制b.Installed是大于当前记录的最小安装日期,会导致同设备多条记录笛卡尔积关联,结果自然不符合预期。
兼容无窗口函数的老版本数据库解法
如果你的数据库不支持窗口函数,可以修改自关联逻辑实现需求:
SELECT a.DeviceName, a.Installed AS InstalledFrom, MIN(b.Installed) AS InstalledTo, a.Customer FROM Device a LEFT JOIN Device b ON a.DeviceName = b.DeviceName AND b.Installed > a.Installed GROUP BY a.DeviceName, a.Installed, a.Customer ORDER BY a.DeviceName, a.Installed;
这个方案通过自关联匹配同设备所有安装日期大于当前记录的行,再取最小的安装日期,就是下一次的安装日期。
内容的提问来源于stack exchange,提问作者Christian Osterrieder
相关产品推荐
相关产品推荐

