我有一个Audit表,我们在其中记录对数据库中字段的更改。我有一个查询,在这里我可以从审计中获取有关几列,记录的更改以及与适用的ID相关联的时间的数据子集。这是输出的示例:
ID ada IsHD HDF DTStamp
-----------------------------------------------------
68 NULL 0 0 2020-04-28 21:12:21.287
68 NULL NULL NULL 2020-04-17 14:59:49.700
68 No/Unsure NULL NULL 2020-04-17 14:03:46.160
68 NULL 0 0 2020-04-17 13:49:49.720
102 NULL NULL NULL 2020-04-30 13:11:15.273
102 No/Unsure NULL NULL 2020-04-20 16:00:35.410
102 NULL 1 1 2020-04-20 15:59:55.750
105 No/Unsure 1 1 2020-04-17 12:06:10.833
105 NULL NULL NULL 2020-04-13 07:51:30.180
126 NULL NULL NULL 2020-05-01 17:59:24.460
126 NULL 0 0 2020-04-28 21:12:21.287
我试图找出的是最有效的方法来“汇总”给定ID的多行,以便保留最新的Non-NULL值,仅对该ID保留一行。
也就是说,转到此:
68 NULL 0 0 2020-04-28 21:12:21.287 68 NULL NULL NULL 2020-04-17 14:59:49.700 68 No/Unsure NULL NULL 2020-04-17 14:03:46.160 68 NULL 0 0 2020-04-17 13:49:49.720 102 NULL NULL NULL 2020-04-30 13:11:15.273 102 No/Unsure NULL NULL 2020-04-20 16:00:35.410 102 NULL 1 1 2020-04-20 15:59:55.750
进入此:
68 No/Unsure 0 0 2020-04-28 21:12:21.287 102 No/Unsure 1 1 2020-04-30 13:11:15.273
...依此类推。就像您要压低结果的顶部并挤出所有NULL一样。
将以上结果转储到临时表@audit
中,然后运行以下查询:
SELECT DISTINCT a.[ID] , (SELECT TOP 1 [ADA] FROM @audit WHERE [ID] = a.[ID] AND [ADA] IS NOT NULL ORDER BY [DTStamp] DESC) AS 'ADA' , (SELECT TOP 1 [IsHD] FROM @audit WHERE [ID] = a.[ID] AND [IsHD] IS NOT NULL ORDER BY [DTStamp] DESC) AS 'IsHD' , (SELECT TOP 1 [HDF] FROM @audit WHERE [ID] = a.[ID] AND [HDF] IS NOT NULL ORDER BY [DTStamp] DESC) AS 'HDF' , (SELECT Max([DTStamp]) FROM @audit WHERE [ID] = a.[ID]) AS 'DTStamp' FROM @audit a ORDER BY [ID]
这是我想出的,它确实起作用,但是感觉非常笨拙且效率低下。有没有更好的方法可以实现最终目标?
我有一个Audit表,我们在其中记录对数据库中字段的更改。我有一个查询,可以从审计中获取有关几列,记录的更改以及...
如果您希望每个ID一行,则使用聚合:
我知道您希望每列id
的“最新”非空值,都使用列DTStamp
进行排序。