【发布时间】:2016-06-09 21:22:00
【问题描述】:
我有一个Customer 表,其结构如下。
CustomerId Name Address Phone
1 Joe 123 Main NULL
我还有一个 Audit 表,用于跟踪对 Customer 表的更改。
Id Entity EntityId Field OldValue NewValue Type AuditDate
1 Customer 1 Name NULL Joe Add 2016-01-01
2 Customer 1 Phone NULL 567-54-3332 Add 2016-01-01
3 Customer 1 Address NULL 456 Centre Add 2016-01-01
4 Customer 1 Address 456 Centre 123 Main Edit 2016-01-02
5 Customer 1 Phone 567-54-3332 843-43-1230 Edit 2016-01-03
6 Customer 1 Phone 843-43-1230 NULL Delete 2016-01-04
我有一个 CustomerHistory 报告表,其中将填充每日 ETL 作业。它与客户表具有相同的字段,并具有附加字段SnapShotDate。
我需要编写一个查询,获取Audit 表中的记录,转换并插入CustomerHistory,如下所示。
CustomerId Name Address Phone SnapShotDate
1 Joe 456 Centre 567-54-3332 2016-01-01
1 Joe 123 Main 567-54-3332 2016-01-02
1 Joe 123 Main 843-43-1230 2016-01-03
1 Joe 123 Main NULL 2016-01-04
我猜该解决方案将涉及审计表上的自联接或递归 CTE。对于开发此解决方案的任何帮助,我将不胜感激。
注意:很遗憾,我无法选择使用触发器或更改审核表架构。查询性能不是问题,因为这将是一个夜间 ETL 过程。
【问题讨论】:
-
为了清楚起见,您已经有一个 ETL 来填充 CustomerHistory,为什么要从 Audit 表中填充它?顺便说一句,这是一个有趣的谜题:)
-
@FLICKER - 澄清一下,我需要构建一个查询来通过 ETL 过程填充 CustomerHistory 表。此时尚未填充数据。
-
知道了。我快找到解决方案了
-
这解决了我的问题。 sqlmag.com/t-sql/last-non-null-puzzle
标签: sql-server sql-order-by audit-trail