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

Select distinct record from union query [duplicate]

提问人:Phelzier 提问时间:11/7/2023 最后编辑:Dale KPhelzier 更新时间:11/7/2023 访问量:55

问:

我有多个表,其中包含来自不同应用程序数据库和扫描引擎的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的结果。

任何正确方向的指示将不胜感激。提前致谢

SQL Server 联合 非重复

评论

0赞 Stu 11/7/2023
那么为什么 ServerA 是 table1 而不是 table3 的 priority1 呢?
0赞 Phelzier 11/8/2023
嗨,Stu,表上没有优先级,因为与其他数据源相比,每个数据源都可能报告不太详细的操作系统,或者可能没有该主机名的记录。数据源来自不同的应用程序,这些应用程序可能在计算机上具有代理,也可能是由网络上的安全软件执行的表单扫描。我为所有操作系统创建了一个中央存储库,并暂时使用一些基本逻辑为描述创建了权重。

答:

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
你是明星,感谢一百万!!