sql - 过滤掉 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 的最新状态更新。
有什么建议么?
解决方案
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
。然后,外部查询过滤每个组中的顶部记录。
推荐阅读
- ios - Firebase Analytics 中的 iOS 版本报告?
- c# - 反序列化 JSON 变量对象数组
- jquery - 如何在 jquery 对话框中使用来自服务器的消息作为文本
- excel - 使用 VBA 从另一个电子表格中的 VLOOKUP
- c++ - 如何将 QProgressBar 放入 QTextEdit
- windows - 用私有实现替换 MSVC CRT 函数
- reactjs - 待办事项列表:删除按钮从错误的列表项中删除信息
- objective-c - 使用 AVAudioEngine 播放 WAV 数据
- javascript - 无法显示来自 FirebaseDatabase 的数据
- vue.js - 如何让 Sheety.co 在 Vue.js 组件中工作