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
- DeviceName DeviceID InvDate
- 计算机 1 101 22/4/2020
- 计算机 2 102 20/4/2020
- 计算机 3 103 2020 年 4 月 19 日
- 计算机 4 104 2020 年 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
您也可以通过 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()
(一般而言)更有效,但它是对横向连接的一个很好的介绍。
我有两个连接表,一个列出设备 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 2020 年 4 月 19 日
- 计算机 4 104 2020 年 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
您也可以通过 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()
(一般而言)更有效,但它是对横向连接的一个很好的介绍。