【发布时间】:2017-06-24 00:12:20
【问题描述】:
我有一个表格,每晚都会插入一个数据快照。在任何时间点,列中的数据都可能发生变化(AccountNo 保持不变,RunKey 增加 1,RunDate 增加 1 天;所有其他列都可以临时更改)。以下是数据外观示例:
|帐号号 |运行键 |运行日期 |地址 |工资 |促销日期| -------------------------------------------------- -------------------------- | 12345 | 2 | 2017 年 6 月 20 日 |大街 123 号 | 60,000 | 2017 年 1 月 15 日 | | 12345 | 3 | 2017 年 6 月 21 日 |大街 123 号 | 60,000 | 2017 年 1 月 15 日 | | 12345 | 4 | 2017 年 6 月 22 日 |大街 123 号 | 65,000 | 2017 年 6 月 21 日 |
使用 LAG 函数和 CASE 表达式,我能够确定何时发生变化(标志为 1 表示已发生变化):
|帐号号 |运行键 |运行日期 |地址 |地址滞后 |地址标志|工资 | SalaryLAG |SalaryFlag|促销日期|促销日期滞后|促销标志| -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------ | 12345 | 2 | 2017 年 6 月 20 日 |大街 123 号 |大街 123 号 | 0 | 60,000 | 60,000 | 0 | 2017 年 1 月 15 日 | 2017 年 1 月 15 日 | 0 | | 12345 | 3 | 2017 年 6 月 21 日 |大街 123 号 |大街 123 号 | 0 | 60,000 | 60,000 | 0 | 2017 年 1 月 15 日 | 2017 年 1 月 15 日 | 0 | | 12345 | 4 | 2017 年 6 月 22 日 |大街 123 号 |大街 123 号 | 0 | 65,000 | 60,000 | 1 | 2017 年 1 月 15 日 | 2017 年 6 月 21 日 | 1 |
我只需要将更改的记录插入到新表中,新表将如下所示:
|运行键 |帐号 |改变Col |上一页运行日期 |运行日期 |上一页价值 |新价值 | -------------------------------------------------- ----------------------------------------- | 4 | 12345 |工资 | 2017 年 6 月 21 日 | 2017 年 6 月 22 日 | 60,000 | 65,000 | | 4 | 12345 |促销日期 | 2017 年 6 月 21 日 | 2017 年 6 月 22 日 | 2017 年 1 月 15 日 | 2017 年 6 月 21 日 |每列更改都会有一条新记录。因此,如果多个列发生更改,则每个更改都将记录在一个新行中。这是我需要帮助的地方,我不知道如何将仅更改的列动态插入到新表中。
【问题讨论】:
-
您确定这就是您想要进行行版本控制或审核更改的方式吗?您可以使用
except看到这非常简单 -
我对想法持开放态度。这只是我的第一个想法,与我合作的人没有其他建议。我更改了数据以简化它,但我正在处理费用和日期,问题是我们的经理可能会问为什么发生了变化,我们有太多的记录我们无法分辨,这就是为什么我们要创建这个表来跟踪任何变化,这样我们就可以回到任何时间点,看看哪里发生了变化,变化是什么。
-
嗯,您正在将数据转换为一种新的审计格式。这对你来说可能没问题,但问题是你会用这些数据做什么?你想怎么查询它。你会在上面做什么聚合/等?以这种格式放置它很难链接回任何数据集,从而可能导致一些问题。所以第一个问题是你打算用它做什么。这将有助于确定这是否是一种合乎逻辑的方法恕我直言
-
我在上面更新了我的推荐,但这个表只是为了跟踪任何变化,所以如果我们被问到为什么值发生了变化,我们可以查询这个表来查看什么/什么时候发生了变化。
-
在这种情况下,您可以在除 RunKey 和 Rundate 之外的所有列上使用 distinct 直接查询表,然后将表自连接到该行的 min(RunDate) 和 min(RunKey)数据。这类似于“仅插入更改”,这是一个更好的主意。也就是说,不是用未更改的行来归档该表,而是仅在发生更改时插入。这将减小表格大小并消除您正在创建的额外表格。这符合业务需求吗?
标签: sql sql-server tsql