选择具有最近日期的唯一值,按另一个值分组
Posted
技术标签:
【中文标题】选择具有最近日期的唯一值,按另一个值分组【英文标题】:Select unique value with most recent date, grouping by another value 【发布时间】:2020-08-06 11:42:38 【问题描述】:我有两个连接表,一个列出设备 ID,另一个列出最近库存收集的 ID 和日期。使用下面的查询我会看到类似的东西:
SELECT d.DeviceName, d.DeviceID, r.InvDate FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
DeviceName DeviceID InvDate
计算机 1 101 22/4/2020
计算机 2 102 20/4/2020
计算机 3 103 19/4/2020
计算机 4 104 5/3/2020
计算机 4 105 22/4/2020
计算机 5 106 20/4/2020
如您所见,有些名称可以重复。
如何提取唯一名称列表(编辑:连同他们的 ID)和最近的库存日期? 在一些完美的世界里,我会在下面做
SELECT d.DeviceID, MAX(r.InvDate) FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
GROUP BY d.DeviceName
【问题讨论】:
如果你想要名字,我会考虑选择 d.DeviceName 等 【参考方案1】:我会为此推荐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()
(通常)更有效,但它是横向连接的一个很好的介绍。
【讨论】:
【参考方案2】:您也可以通过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
【讨论】:
以上是关于选择具有最近日期的唯一值,按另一个值分组的主要内容,如果未能解决你的问题,请参考以下文章