SQL(SCCM数据库)中的查询在有重复项时仅选择最新记录

斯托克雷斯

我需要修改下面的查询只选择最新的记录LastLogin,如果BIOSSerialNumber是重复的。我已经尝试过类似问题(row_number(),子查询等)中提出的解决方案,但是我无法使其工作。

这是对SCCM数据库的SQL查询:

SELECT 
v_GS_COMPUTER_SYSTEM.Name0 as name,
v_GS_COMPUTER_SYSTEM_PRODUCT.Version0 as model,
v_GS_COMPUTER_SYSTEM.ResourceID,
v_GS_SYSTEM.SystemRole0 as SystemRole,
v_GS_OPERATING_SYSTEM.Caption0 as caption,
v_GS_SYSTEM_ENCLOSURE.ChassisTypes0 as chassistype,
v_GS_WORKSTATION_STATUS.LastHWScan, 
v_GS_PC_BIOS.SerialNumber0 as BIOSSerialNumber,
v_GS_COMPUTER_SYSTEM_PRODUCT.UUID0 as UUIDSerialNumber,
v_GS_SYSTEM_ENCLOSURE.SerialNumber0 as ChassisSerialNumber,
v_GS_BASEBOARD.SerialNumber0 as BaseboardSerialNumber,
v_R_SYSTEM.Last_Logon_Timestamp0 as LastLogin

FROM v_GS_COMPUTER_SYSTEM
LEFT JOIN v_GS_WORKSTATION_STATUS ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_WORKSTATION_STATUS.ResourceID 
LEFT JOIN v_GS_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_SYSTEM.ResourceID 
LEFT JOIN v_GS_PC_BIOS ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_PC_BIOS.ResourceID
LEFT JOIN v_GS_OPERATING_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_OPERATING_SYSTEM.ResourceID
LEFT JOIN v_GS_COMPUTER_SYSTEM_PRODUCT ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_COMPUTER_SYSTEM_PRODUCT.ResourceID
LEFT JOIN v_GS_SYSTEM_ENCLOSURE ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_SYSTEM_ENCLOSURE.ResourceID
LEFT JOIN v_GS_BASEBOARD ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_BASEBOARD.ResourceID
LEFT JOIN v_R_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_SYSTEM.ResourceID

如果结果是:

name    model   ResourceID  …   BIOSSerialNumber    …   LastLogin
ABC-123 HP XYZ  567845678   …   SerialNumber1       …   2020-10-26 21:14:28.000
DEF-456 HP XYZ  984567432   …   SerialNumber1       …   2020-10-24 07:32:05.000
EFG-789 HP XYZ  127687643   …   SerialNumber2       …   2020-10-21 08:35:05.000

我只需要返回第1行和第3行,因为第2行的BIOSSerialNumber与第1行相同,但LastLogin较旧:

name    model   ResourceID  …   BIOSSerialNumber    …   LastLogin
ABC-123 HP XYZ  567845678   …   SerialNumber1       …   2020-10-26 21:14:28.000
EFG-789 HP XYZ  127687643   …   SerialNumber2       …   2020-10-21 08:35:05.000

有没有办法做到这一点?提前谢谢了。

SQL Sifu

如果您按BIOSSerialNumber进行分区,并按LastLogin进行排序,则使用row_number函数,如下所示:

;with cte_SCCM as
(
    SELECT 
    v_GS_COMPUTER_SYSTEM.Name0 as name,
    v_GS_COMPUTER_SYSTEM_PRODUCT.Version0 as model,
    v_GS_COMPUTER_SYSTEM.ResourceID,
    v_GS_SYSTEM.SystemRole0 as SystemRole,
    v_GS_OPERATING_SYSTEM.Caption0 as caption,
    v_GS_SYSTEM_ENCLOSURE.ChassisTypes0 as chassistype,
    v_GS_WORKSTATION_STATUS.LastHWScan, 
    v_GS_PC_BIOS.SerialNumber0 as BIOSSerialNumber,
    v_GS_COMPUTER_SYSTEM_PRODUCT.UUID0 as UUIDSerialNumber,
    v_GS_SYSTEM_ENCLOSURE.SerialNumber0 as ChassisSerialNumber,
    v_GS_BASEBOARD.SerialNumber0 as BaseboardSerialNumber,
    v_R_SYSTEM.Last_Logon_Timestamp0 as LastLogin,
    ROW_NUMBER() OVER (PARTITION BY v_GS_PC_BIOS.SerialNumber0 ORDER BY v_R_SYSTEM.Last_Logon_Timestamp0 DESC) as RN

    FROM v_GS_COMPUTER_SYSTEM
    LEFT JOIN v_GS_WORKSTATION_STATUS ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_WORKSTATION_STATUS.ResourceID 
    LEFT JOIN v_GS_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_SYSTEM.ResourceID 
    LEFT JOIN v_GS_PC_BIOS ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_PC_BIOS.ResourceID
    LEFT JOIN v_GS_OPERATING_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_OPERATING_SYSTEM.ResourceID
    LEFT JOIN v_GS_COMPUTER_SYSTEM_PRODUCT ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_COMPUTER_SYSTEM_PRODUCT.ResourceID
    LEFT JOIN v_GS_SYSTEM_ENCLOSURE ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_SYSTEM_ENCLOSURE.ResourceID
    LEFT JOIN v_GS_BASEBOARD ON v_GS_COMPUTER_SYSTEM.ResourceID = v_GS_BASEBOARD.ResourceID
    LEFT JOIN v_R_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_SYSTEM.ResourceID
)

SELECT *
FROM cte_SCCM 
WHERE RN = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何轻松地选择或标记SQL数据库中的最新重复项

Laravel在数据库中有1条记录时显示重复项

如何在SQL中仅查询数据库中的旧数据和重复数据

从sql数据库中选择最新的3条记录

仅返回数据库中的重复记录

从数据库中仅选择最新条目

从SQL数据库中选择所有内容(重复项除外)

Django ORM。从数据库中仅选择重复的字段

使用SQL查询选择数据库数据时出错?

显示数据库中重复项的数量[SQL]

从Redshift数据库中删除所有重复项

显示所有尚未避免的SQL Server [Moodle] [PHP]中数据库列记录的重复

如何检索此数据库中重复项的最新数据?

如何在Azure SQL数据库中记录所有查询事件

记录时选择数据库

数据库中的重复项

Access SQL查询:如何仅显示重复的最新记录

从重复的数据库中选择除前 1 项之外的所有数据

在 WPF DataGrid 中仅显示数据库中的重复项

表中有重复记录,我们需要使用sql中的group by或window函数仅选择按日期的最新记录

EF生成的SQL查询在查询datetime列时返回空结果,但该记录存在于数据库中

如何从具有重复项的表中查询最新项?

从数据库中选择最新的历史记录

与唯一项相关联时,是否有必要在数据库中记录图像路径?

查询数据库中更新的记录

如何编写查询以从数据库表中获取最新记录

使用SQL查询在数据库中创建新条目时添加(最新添加的ID + 1)

根据复杂标准从SQL Server数据库中选择重复项

如何检查SQL数据库中是否有记录?