Select 具有最近日期的唯一值,按另一个值分组

Select unique value with most recent date, grouping by another value

我有两个连接表,一个列出设备 ID 并命名其他 ID 和最近收集清单的日期。使用下面的查询我会看到类似的东西:

SELECT d.DeviceName, d.DeviceID, r.InvDate FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID

如您所见,有些名称可以重复。

如何提取唯一名称列表(编辑:连同他们的 ID)和最近的库存日期? 在一些完美的世界中,我会在下面做

SELECT d.DeviceID, MAX(r.InvDate) FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
GROUP BY d.DeviceName

您也可以通过 row_number() 完成此操作。

select
    DeviceName,
    DeviceID,
    InvDate
from
(
    select
        DeviceName,
        d.DeviceID,
        InvDate,
        row_number() over (partition by DeviceName order by InvDate desc) as rnk
    from device
    join report r
    on d.DeviceID = r.DeviceID
) vals
where rnk = 1
order by    
    DeviceID

我会为此推荐 apply

SELECT d.DeviceID, d.DeviceName, r.*
FROM Device d OUTER APPLY
     (SELECT TOP (1) r.*
      FROM report r
      WHERE d.DeviceID = r.DeviceID
      ORDER BY r.InvDate DESC
     ) r;

请注意,这比使用 ROW_NUMBER()(一般而言)更有效,但它是对横向连接的一个很好的介绍。