多表连接场景下获取最新日期单行数据的技术问题求助
解决多表连接中获取最新日期单行数据的问题
我明白你在关联Unit、History、Link、Station这四张表时,卡在了如何筛选出对应最新日期的单行记录上,下面给你两种实用的解决方案:
首先先明确默认的表关联逻辑(如果实际关联关系有差异,你可以调整JOIN条件):Unit.SN ↔ Link.SN,Link.ID ↔ History.ID,History.ID ↔ Station.ID
方法1:子查询先取最新日期,再关联全表
这种方式先筛选出每个SN对应的最新日期,再通过这个结果回连Unit表拿到完整记录,最后关联其余表:
SELECT u.SN, u.DateTime AS UnitLatestTime, h.ID AS HistoryID, s.Type, s.datetime AS StationTime, s.location FROM Unit u -- 子查询获取每个SN的最新DateTime INNER JOIN ( SELECT SN, MAX(DateTime) AS LatestDateTime FROM Unit GROUP BY SN ) latest_unit ON u.SN = latest_unit.SN AND u.DateTime = latest_unit.LatestDateTime -- 关联其他表 INNER JOIN Link l ON u.SN = l.SN INNER JOIN History h ON l.ID = h.ID INNER JOIN Station s ON h.ID = s.ID;
方法2:窗口函数(更灵活,适配复杂排序场景)
如果需要同时参考多个日期字段排序,窗口函数ROW_NUMBER()会更方便。它能给每个SN分组内的记录按日期降序编号,取编号为1的就是最新那条:
SELECT SN, UnitLatestTime, HistoryID, Type, StationTime, location FROM ( SELECT u.SN, u.DateTime AS UnitLatestTime, h.ID AS HistoryID, s.Type, s.datetime AS StationTime, s.location, -- 按SN分组,每组内按DateTime降序排序生成序号 ROW_NUMBER() OVER (PARTITION BY u.SN ORDER BY u.DateTime DESC) AS row_num FROM Unit u INNER JOIN Link l ON u.SN = l.SN INNER JOIN History h ON l.ID = h.ID INNER JOIN Station s ON h.ID = s.ID ) ranked_records -- 只保留每组的第一条(最新记录) WHERE row_num = 1;
额外提示
- 如果你的“最新日期”指的是Station表的
datetime而非Unit的DateTime,只需把排序字段改成s.datetime DESC,子查询逻辑也对应调整为取每个Station ID的最新日期即可。 - 如果存在部分SN没有关联的History/Link/Station记录,把
INNER JOIN换成LEFT JOIN就能保留这些SN的记录(对应关联表字段会显示为NULL)。
内容的提问来源于stack exchange,提问作者Just_Stacking
相关产品推荐
相关产品推荐

