首页 > 解决方案 > Microsoft SQL Server - 获取最新的价值记录

问题描述

我一点也不精通 SQL,但我的任务是整理一份 CIS 基准测试成绩报告。我需要获得每个系统的最新分数,没有重复。

system_identifier 表包含系统信息字段;我正在获取值类型 1426(主机名)

test_result 表包含分数和日期字段。

这是我当前的查询:

SELECT system_identifier.value AS [System Name], test_result.score + '%' AS [Most Recent Score], LEFT(MAX(test_result.upload_date), 10) AS [Test Date]
FROM system_identifier INNER JOIN test_result ON system_identifier.target_system_id = test_result.target_system_id
WHERE (system_identifier.type_id = 1426)
GROUP BY system_identifier.value, test_result.score
ORDER BY system_identifier.value

这当前返回系统名称 + 分数组合唯一的所有记录。

System Name   Most Recent Score   Test Date
-----------   -----------------   ---------
system1       84                  2019-06-10
system1       87                  2019-08-24
system1       94                  2019-09-14
system2       78                  2019-07-22
system2       85                  2019-09-12
system3       65                  2019-05-23
system3       74                  2019-07-03
system3       81                  2019-08-09
system3       91                  2019-09-10

这是我需要的:

System Name   Most Recent Score   Test Date
-----------   -----------------   ---------
system1       94                  2019-09-14
system2       85                  2019-09-12
system3       91                  2019-09-10

我已经尝试对此进行研究,但我不确定如何为搜索提出我的问题,所以我想我会在这里问,因为我可以更详细地了解我正在寻找的内容。

如果您需要更多信息,请告诉我。

编辑 Neeraj 的回答让我走上了正确的道路,所以标记为答案。

我最终使用初始 SELECT 创建了一个视图,将所有内容放在一个名为“合并”的表中。然后,我在这个查询上取得了成功(使用一些格式使它更漂亮):

SELECT DISTINCT
UPPER(merged.value) AS Hostname,
merged.score + '%' AS Score
LEFT(merged.upload_date,10) AS [Date Uploaded],
FROM dbo.merged
INNER JOIN (SELECT merged.value AS hostname, MAX(merged.upload_date) AS Uploaded
FROM dbo.merged
GROUP BY merged.value) t2
ON merged.value = t2.hostname
AND merged.upload_date = t2.Uploaded
WHERE merged.type_id = 1426
ORDER BY hostname

标签: sqlsql-server

解决方案


使用相关子查询:

select t1.SystemName, t1.MostRecentScore, t1.TestDate
from myTable t1
where t1.TestDate =
(
select max(t2.TestDate)
from myTable t2
where t2.SystemName = t1.SystemName
)

推荐阅读