首页 > 解决方案 > 过滤掉 SQL Query 中的重复行

问题描述

我正在尝试使用 SQL 从 SCCM 中提取更新合规性数据,并提出以下查询:

SELECT updates.ArticleID, updates.Title, devices.Name, MAX(compliance.LastStatusChangeTime) AS LastUpdated, compliance.[Status]
FROM v_UpdateDeploymentSummary deployments
INNER JOIN v_UpdateInfo updates
    ON deployments.CI_ID=updates.CI_ID
INNER JOIN CollectionMembers devices
    ON deployments.CollectionID=devices.SiteID
INNER JOIN v_UpdateComplianceStatus compliance
    ON compliance.CI_ID=deployments.CI_ID
WHERE compliance.[Status] IS NOT NULL
GROUP BY updates.ArticleID, updates.Title, devices.Name, compliance.[Status]
ORDER BY ArticleID, LastUpdated DESC

但是,看起来 SCCM 为同一个更新部署存储了多个合规性状态记录。例如,昨晚在该设备上安装了KB890830 ,从今天早上 09:19 开始,这反映在下面的行中。我想更改查询,以便返回的唯一行是第 15 行,显示该 KB 的最新状态更新。

在此处输入图像描述

有什么建议么?

标签: sqlsql-serverdatabaseselectgreatest-n-per-group

解决方案


row_number()您可以使用窗口函数进行过滤,而不是聚合:

SELECT *
FROM (
    SELECT 
        updates.ArticleID, 
        updates.Title, 
        devices.Name, 
        compliance.LastStatusChangeTime AS LastUpdated, 
        compliance.[Status],
        ROW_NUMBER() OVER(
            PARTITION BY updates.ArticleID 
            ORDER BY compliance.LastStatusChangeTime DESC
        ) rn
    FROM v_UpdateDeploymentSummary deployments
    INNER JOIN v_UpdateInfo updates
        ON deployments.CI_ID=updates.CI_ID
    INNER JOIN CollectionMembers devices
        ON deployments.CollectionID=devices.SiteID
    INNER JOIN v_UpdateComplianceStatus compliance
        ON compliance.CI_ID=deployments.CI_ID
    WHERE compliance.[Status] IS NOT NULL
) t
WHERE rn = 1
ORDER BY ArticleID, LastUpdated DESC

在内部查询中,row_number()将排名分配给具有相同的记录ArticleID,按降序排列LastStatusChangeTime。然后,外部查询过滤每个组中的顶部记录。


推荐阅读