提问人:Phelzier 提问时间:11/7/2023 最后编辑:Dale KPhelzier 更新时间:11/7/2023 访问量:55
从联合查询中选择不同的记录 [duplicate]
Select distinct record from union query [duplicate]
问:
我有多个表,其中包含来自不同应用程序数据库和扫描引擎的OS_Data,我根据数据的清晰度为数据赋予了优先级。我想获取优先级最低的唯一主机名列表以及该优先级的相关操作系统
表1
主机名 | Operating_System | OS_Priority |
---|---|---|
服务器A | Windows 服务器 2016 | 1 |
服务器B | 窗户 | 2 |
服务器C | Windows 服务器 2016 | 1 |
服务器 E | Windows 服务器 2016 | 1 |
表2
主机名 | Operating_System | OS_Priority |
---|---|---|
服务器A | 窗户 | 2 |
服务器B | Windows 服务器 2012 R2 | 1 |
服务器C | Windows 服务器 2016 1809 | 1 |
服务器D | 未知 | 3 |
服务器 E | 未知 | 3 |
表3
主机名 | Operating_System | OS_Priority |
---|---|---|
服务器A | Windows 服务器 2016 1809 | 1 |
服务器C | 窗户 | 2 |
服务器 E | Windows 服务器 2016 1809 | 1 |
预期结果
主机名 | Operating_System |
---|---|
服务器A | Windows 服务器 2016 |
服务器B | Windows 服务器 2012 R2 |
服务器C | Windows 服务器 2016 1809 |
服务器D | 未知 |
服务器 E | Windows 服务器 2016 1809 |
我只需要最上面的不同主机名以及它的Operating_System。如果出现平局,那么我得到哪个结果并不重要,我只需要 1 条记录
我可能会将五到六个表加在一起,但只使用三个作为示例。
这将为我提供一个不同记录的列表
SELECT Hostname, Operating_System, OS_Priority FROM [Table1]
UNION
SELECT Hostname, Operating_System, OS_Priority FROM[Table2]
UNION
SELECT Hostname, Operating_System, OS_Priority FROM[Table3]
WHERE Hostname is not null
ORDER BY Hostname, OS_Priority
我尝试使用 MIN(OS_Priority) 和 GROUP BY 主机名,但无法获得包含Operating_System的结果。
任何正确方向的指示将不胜感激。提前致谢
答:
0赞
siggemannen
11/7/2023
#1
这是ROW_NUMBER的工作。
将你的联合包装成一个子查询,并添加一个 ,最后只得到最上面的一行:ROW_NUMBER() OVER (PARTITION BY HostName ORDER BY OS_priority)
SELECT *
FROM (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY HostName ORDER BY OS_priority) AS sort
FROM (
SELECT Hostname, Operating_System, OS_Priority
FROM [Table1]
UNION ALL
SELECT Hostname, Operating_System, OS_Priority
FROM [Table2]
UNION ALL
SELECT Hostname, Operating_System, OS_Priority
FROM [Table3]
WHERE Hostname IS NOT NULL
) x
) x
WHERE x.sort = 1
评论
0赞
Phelzier
11/7/2023
你是明星,感谢一百万!!
评论