SQL查询:为每个订单的每个ID_Phase选取最新日期记录
解决方法
你的原SQL存在几个关键问题:
- 子查询仅按
ID_Phase分组,未结合ID_Order,会导致不同订单的同一阶段最大日期被合并,无法实现每个订单的每个阶段取最新行的需求 - 拼写错误:
tt.Data应为tt.Date - 固定了
ID_Order = 0001,若需所有订单的结果,该条件需移除
以下是两种正确的实现方式:
方法1:JOIN + 分组(兼容多数SQL数据库)
SELECT tt.* FROM Production_Phases_History tt INNER JOIN ( SELECT ID_Phase, ID_Order, MAX(Date) AS MaxDateTime FROM Production_Phases_History GROUP BY ID_Phase, ID_Order -- 必须同时按订单+阶段分组 ) groupedtt ON tt.ID_Phase = groupedtt.ID_Phase AND tt.ID_Order = groupedtt.ID_Order -- 关联时需同时匹配订单ID AND tt.Date = groupedtt.MaxDateTime ORDER BY tt.ID_Order, tt.ID_Phase;
方法2:窗口函数(推荐,逻辑更直观)
若你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),使用ROW_NUMBER()会更清晰:
SELECT ID_Phase, ID_Order, Date FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID_Phase, ID_Order -- 按订单+阶段划分分组 ORDER BY Date DESC -- 按日期倒序排列,最新行排第1位 ) AS rn FROM Production_Phases_History ) t WHERE rn = 1 -- 仅保留每个分组的第1行(最新日期记录) ORDER BY ID_Order, ID_Phase;
如果只需查询特定订单(如0001),可在子查询或外层添加WHERE ID_Order = '0001'(注意订单ID为字符串类型时需加引号)。
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

