sql - 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
解决方案
使用相关子查询:
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
)