Select 仅第一行指定仅来自一列的不同结果
Select only first row of specify distinct results from one column only
我正在尝试创建一个查询,以获取每台设备上次软件使用时间的结果。
在 table 中有文件名列和每个设备的开始时间。我 运行 遇到的问题是我只关心每台设备的最晚开始时间,但 table 由于记录了多个开始时间,因此会有多行。有没有一种方法只能根据设备名称获得不同的结果?我可以按开始时间对它们进行排序,然后按设备名称对它们进行排序,但我想删除每台机器的重复行。我看过类似的帖子,这些帖子使用带有 row_number() (order by sud.StartTimeLocal) as rn
的子选择,但是当我尝试这样做时,它只是 returned 一行。我正在为报告创建它,并且更愿意找到一种方法来仅 return 每台机器的最新时间行,而不是尝试在报告中对它们进行分组。
这是我的查询:
declare @ProductName as nvarchar(250) = 'Visio'
select
sy.resourceid,
sy.name0 as 'DeviceName',
sud.FileName,
sud.FileDescription,
case
substring(sud.FileVersion,1,2)
when '16' then (Sud.FileDescription + ' 2016')
when '15' then (Sud.FileDescription + ' 2013')
when '14' then (Sud.FileDescription + ' 2010')
end as 'Product',
sud.FileVersion,
sud.StartTimeLocal as 'LastExecuted'
from v_R_system sy
left join v_GS_SoftwareUsageData sud on sy.ResourceID = sud.ResourceID
where sud.FileName in (
(@ProductName + '.EXE')
)
and sud.StartNotCaptured != 1
order by sud.StartTimeLocal desc,sud.FileName,sy.Name0
这是我得到的结果示例
DeviceName FileName FileDescription Product FileVersion LastExecuted
Machine Name1 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4993.1001 4/29/2020 10:07
Machine Name1 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4993.1001 4/29/2020 10:07
Machine Name2 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4954.1000 4/28/2020 11:01
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/28/2020 8:46
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 16:20
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 16:15
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 15:25
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 12:30
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 11:51
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 11:34
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 8:04
如果我不得不推测,您需要 v_GS_SoftwareUsageData
中的一个匹配行与第一个 table 中的每一行匹配。可能最好的方法是 cross apply
:
select sy.resourceid, sy.name0 as DeviceName, sud.FileName, sud.FileDescription,
(case left(sud.FileVersion,2)
when '16' then (Sud.FileDescription + ' 2016')
when '15' then (Sud.FileDescription + ' 2013')
when '14' then (Sud.FileDescription + ' 2010')
end) as Product,
sud.FileVersion,
sud.StartTimeLocal as LastExecuted
from v_R_system sy cross apply
(select top (1) sud.*
from v_GS_SoftwareUsageData sud
where sy.ResourceID = sud.ResourceID and
sud.FileName = @ProductName + '.EXE' and
sud.StartNotCaptured <> 1
order by sud.StartTimeLocal desc, sud.FileName
) sud;
我正在尝试创建一个查询,以获取每台设备上次软件使用时间的结果。
在 table 中有文件名列和每个设备的开始时间。我 运行 遇到的问题是我只关心每台设备的最晚开始时间,但 table 由于记录了多个开始时间,因此会有多行。有没有一种方法只能根据设备名称获得不同的结果?我可以按开始时间对它们进行排序,然后按设备名称对它们进行排序,但我想删除每台机器的重复行。我看过类似的帖子,这些帖子使用带有 row_number() (order by sud.StartTimeLocal) as rn
的子选择,但是当我尝试这样做时,它只是 returned 一行。我正在为报告创建它,并且更愿意找到一种方法来仅 return 每台机器的最新时间行,而不是尝试在报告中对它们进行分组。
这是我的查询:
declare @ProductName as nvarchar(250) = 'Visio'
select
sy.resourceid,
sy.name0 as 'DeviceName',
sud.FileName,
sud.FileDescription,
case
substring(sud.FileVersion,1,2)
when '16' then (Sud.FileDescription + ' 2016')
when '15' then (Sud.FileDescription + ' 2013')
when '14' then (Sud.FileDescription + ' 2010')
end as 'Product',
sud.FileVersion,
sud.StartTimeLocal as 'LastExecuted'
from v_R_system sy
left join v_GS_SoftwareUsageData sud on sy.ResourceID = sud.ResourceID
where sud.FileName in (
(@ProductName + '.EXE')
)
and sud.StartNotCaptured != 1
order by sud.StartTimeLocal desc,sud.FileName,sy.Name0
这是我得到的结果示例
DeviceName FileName FileDescription Product FileVersion LastExecuted
Machine Name1 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4993.1001 4/29/2020 10:07
Machine Name1 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4993.1001 4/29/2020 10:07
Machine Name2 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.4954.1000 4/28/2020 11:01
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/28/2020 8:46
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 16:20
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 16:15
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 15:25
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 12:30
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 11:51
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 11:34
Machine Name3 VISIO.EXE Microsoft Visio Microsoft Visio 2016 16.0.11929.20648 4/27/2020 8:04
如果我不得不推测,您需要 v_GS_SoftwareUsageData
中的一个匹配行与第一个 table 中的每一行匹配。可能最好的方法是 cross apply
:
select sy.resourceid, sy.name0 as DeviceName, sud.FileName, sud.FileDescription,
(case left(sud.FileVersion,2)
when '16' then (Sud.FileDescription + ' 2016')
when '15' then (Sud.FileDescription + ' 2013')
when '14' then (Sud.FileDescription + ' 2010')
end) as Product,
sud.FileVersion,
sud.StartTimeLocal as LastExecuted
from v_R_system sy cross apply
(select top (1) sud.*
from v_GS_SoftwareUsageData sud
where sy.ResourceID = sud.ResourceID and
sud.FileName = @ProductName + '.EXE' and
sud.StartNotCaptured <> 1
order by sud.StartTimeLocal desc, sud.FileName
) sud;