选择具有最新日期的唯一值,然后按另一个值分组

时间:2020-04-23 08:08:29

标签: sql sql-server tsql join greatest-n-per-group

我有两个连接的表,一个表列出了设备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
  • Computer2 102 20/4/2020
  • Computer3 103 19/4/2020
  • 计算机4 104年5月3日
  • 计算机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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

为此,我推荐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()(通常)更有效,但这是对横向连接的很好介绍。

相关问题