从联合查询中选择不同的记录

问题描述 投票:0回答:1

一直在兜圈子,寻找有关 MS SQL Server 查询的帮助。

我有多个表,其中包含来自不同应用程序数据库和扫描引擎的 OS_Data,我根据数据的清晰度为这些数据赋予了优先级。我想获取具有最低优先级的唯一主机名列表以及该优先级的相关操作系统

表1

主机名 操作系统 操作系统_优先级
服务器A Windows Server 2016 1
服务器B Windows 2
服务器C Windows Server 2016 1
服务器E Windows Server 2016 1

表2

主机名 操作系统 操作系统_优先级
服务器A Windows 2
服务器B Windows Server 2012 R2 1
服务器C Windows Server 2016 1809 1
服务器D 未知 3
服务器E 未知 3

表3

主机名 操作系统 操作系统_优先级
服务器A Windows Server 2016 1809 1
服务器C Windows 2
服务器E Windows Server 2016 1809 1

预期结果

主机名 操作系统
服务器A Windows Server 2016
服务器B Windows Server 2012 R2
服务器C Windows Server 2016 1809
服务器D 未知
服务器E Windows Server 2016 1809

我只需要顶部不同的主机名及其操作系统。如果有平局,那么我得到哪个结果并不重要,我只需要 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 Hostname,但无法获得包含 Operating_System 的结果。

任何正确方向的指示将不胜感激。预先感谢

sql-server union distinct
1个回答
0
投票

这是 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
© www.soinside.com 2019 - 2024. All rights reserved.