You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按每个WayBillNo的最大Date获取对应Id

问题描述

现有如下物流状态数据表(含示例数据):

Id  WayBillNo       Date                       Status
------------------------------------------------------------------------------
    1   501263027308    2023-03-10 23:59:59.000    DELIVERED
    2   501263027308    2023-03-10 09:01:12.000    OUT FOR DELIVERY
    3   501263027308    2023-03-09 16:53:25.000    IN-TRANSIT
    4   501263027308    2023-03-09 03:40:37.000    IN-TRANSIT
    5   501263027308    2023-03-08 01:36:24.000    ARRIVED AT DESTINATI
    6   501263027308    2023-03-03 15:59:23.000    IN-TRANSIT
    7   501263027308    2023-03-01 20:50:38.000    IN-TRANSIT
    8   501263027312    2023-03-05 12:11:29.000    ARRIVED AT DESTINATI
    9   501263027312    2023-03-04 23:27:27.000    IN-TRANSIT
    10  501263027312    2023-03-03 19:11:06.000    IN-TRANSIT
    11  501263027312    2023-03-02 14:26:06.000    IN-TRANSIT
    12  501263027312    2023-03-01 20:50:38.000    IN-TRANSIT

需求:提取每个WayBillNo(运单号)对应**最新时间(最大Date)**的记录关联的Id,期望输出结果:

Id
---
1   
8

解决方案

方法1:子查询关联(兼容多数SQL数据库)

先按运单号分组,获取每组的最大时间,再关联原表匹配时间与运单号,得到对应的Id:

SELECT t.Id
FROM your_table_name t
JOIN (
    SELECT WayBillNo, MAX(Date) AS latest_date
    FROM your_table_name
    GROUP BY WayBillNo
) t_latest 
ON t.WayBillNo = t_latest.WayBillNo AND t.Date = t_latest.latest_date;

注意:如果同一运单号存在多条时间完全相同的最新记录,该方法会返回所有对应的Id。

方法2:窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等)

利用ROW_NUMBER()窗口函数按运单号分组,按时间倒序排序,取每组的第一条记录的Id:

SELECT Id
FROM (
    SELECT 
        Id,
        ROW_NUMBER() OVER (PARTITION BY WayBillNo ORDER BY Date DESC) AS row_rank
    FROM your_table_name
) ranked_records
WHERE row_rank = 1;

注意:若同一运单号有多条时间相同的最新记录,ROW_NUMBER()会随机为其分配序号,仅返回其中一条Id。若需返回所有这类记录,可替换为RANK()或DENSE_RANK()函数。

内容的提问来源于stack exchange,提问作者DeepakVerma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:28:07