筛选出SQL查询中的重复行

我正在尝试使用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,compliance.[Status]
ORDER BY ArticleID,LastUpdated DESC

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

筛选出SQL查询中的重复行

有什么建议吗?

edencpp 回答:筛选出SQL查询中的重复行

您可以使用窗口函数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进行排序。然后,外部查询会在每组的顶部记录中进行过滤。

本文链接:https://www.f2er.com/2979385.html

大家都在问