如何跨多个列和行“汇总”数据

问题描述 投票:2回答:2

我有一个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表,我们在其中记录对数据库中字段的更改。我有一个查询,可以从审计中获取有关几列,记录的更改以及...

sql sql-server tsql sql-server-2012 greatest-n-per-group
2个回答
1
投票

如果您希望每个ID一行,则使用聚合:


0
投票

我知道您希望每列id的“最新”非空值,都使用列DTStamp进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.