从审计记录构建快照表

2023-12-25

我有一个Customer表具有以下结构。

CustomerId Name   Address    Phone
1          Joe    123 Main   NULL

我也有一个Audit跟踪更改的表Customer table.

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。对于开发此解决方案的任何帮助,我将不胜感激。

Note:不幸的是,我无法选择使用触发器或更改审核表架构。查询性能不是问题,因为这将是每晚的 ETL 过程。


您可以使用下面的脚本。

DROP TABLE #tmp

CREATE TABLE #tmp (
    id INT Identity
    , EntityId INT
    , NAME VARCHAR(10)
    , Address VARCHAR(100)
    , Phone VARCHAR(20)
    , Type VARCHAR(10)
    , SnapShotDate DATETIME
    )

;with cte1 as (
select AuditDate, EntityId, Type, [Name], [Address], [Phone]
from 
    (select AuditDate, EntityId, Type, Field, NewValue from #Audit) p
pivot
    (
    max(NewValue)
    for Field in ([Name], [Address], [Phone])
    ) as xx
)
insert into #tmp (EntityId, Name, Address, Phone, Type, SnapShotDate)
select EntityId, Name, Address, Phone, Type, AuditDate
from cte1


-- update NULLs columns with the most recent value
update #tmp
set Name = (select top 1 Name from #tmp tp2 
            where EntityId = tp2.EntityId and Name  is not null 
            order by id desc)
where Name is null

update #tmp
set Address = (select top 1 Address from #tmp tp2 
               where EntityId = tp2.EntityId and Address is not null 
               order by id desc)
where Address is null

update #tmp
set Phone = (select top 1 Phone from #tmp tp2 
             where EntityId = tp2.EntityId and Phone is not null 
             order by id desc)
where Phone is null

创造Test Data,使用下面的脚本

CREATE TABLE #Customer (
    CustomerId INT
    , NAME VARCHAR(10)
    , Address VARCHAR(100)
    , Phone VARCHAR(20)
    )

INSERT INTO #Customer
VALUES (1, 'Joe', '123 Main', NULL)

CREATE TABLE #Audit (
    Id INT
    , Entity VARCHAR(50)
    , EntityId INT
    , Field VARCHAR(20)
    , OldValue VARCHAR(100)
    , NewValue VARCHAR(100)
    , Type VARCHAR(10)
    , AuditDate DATETIME
    )

insert into #Audit values
(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'),
(7,   'Customer', 2,         'Name'     ,NULL            ,'Peter'        ,'Add'    ,'2016-01-01'),
(8,   'Customer', 2,         'Phone'    ,NULL            ,'111-222-3333'  ,'Add'    ,'2016-01-01'),
(8,   'Customer', 2,         'Address'  ,NULL            ,'Parthenia'   ,'Add'    ,'2016-01-01')

Result

EntityId    Name    Address     Phone           Type    SnapShotDate
1           Joe     456 Centre  567-54-3332     Add     2016-01-01
1           Joe     123 Main    843-43-1230     Edit    2016-01-02
1           Joe     123 Main    843-43-1230     Edit    2016-01-03
1           Joe     123 Main    843-43-1230     Delete  2016-01-04
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从审计记录构建快照表 的相关文章

  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • 解释 SQL Server 中 sys.objects 中的类型代码

    在 SQL Server 上 sys objects 表包含 Type 和 Type Desc 属性 例如 对于我的一个数据库 SELECT DISTINCT Type Type Desc FROM Sys Objects ORDER BY
  • 如何通过Object Id和Column Id查询表数据?

    有桌子Clients PK LastName Name Address 1 Vidal Arturo St 2 Lavezzi Ezequiel St 3 Cuadrado Guillermo St 我想得到 通过以下查询 我可以得到前四列
  • 打开脚本任务时 SSIS 丢失文件引用

    我们使用自定义审核程序集 C 在脚本任务中记录 SSIS 中的多种操作 我们将在 GAC 中构建自定义程序集 用于运行时 并发布到 IDE VS2008 的公共程序集区域以供设计时文件引用 后构建完成后 自定义程序集可在运行时使用 并可在文
  • 按小时拆分日期/时间数据并将日期/时间范围展开为行

    我正在尝试使用 SQL Server 将一系列日期 时间数据扩展为多行 例如 我的数据看起来像 Date StartTime EndTime EmployeeID ShiftType 10 1 2019 8 30 00AM 4 57 00P
  • 清除表中的所有行将身份规范重置为零并且不影响外键?

    我们已经创建了数据库框架以及所有关系和依赖关系 但表内部只是虚拟数据 我们需要删除这些虚拟数据 并开始添加正确的数据 我们怎样才能清除所有内容并将主键 IsIdentity 是 保留为零 并且不影响外部表关系结构 多谢 您可以采取以下步骤
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • SSRS。如何在table1_Details_Group右侧创建新的行组?

    我正在使用 Microsoft Visual Studio 2013 创建报告 PROBLEM 如果我添加新的Row Group前面会自动添加table1 Details Group 问题 如何更改组的顺序或在右侧添加新组table1 De
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • sql查询中的truncate和delete命令有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 SQL中TRUNCATE和DELETE有什么区别 https stackoverflow com questions 139630 whats the difference between trunc
  • 对具有许多索引的表进行缓慢的批量插入

    我尝试将数百万条记录插入到具有 20 多个索引的表中 在上次运行中 每 100 000 行花费了 4 个多小时 并且查询在 3 5 天后被取消 您对如何加快速度有什么建议吗 我怀疑是索引太多的原因 如果你也这么认为 如何在操作前自动删除索引
  • OrderBy("it." + sort) -- LINQ to Entity 框架中的硬编码?

    我一直在尝试在应用程序中使用动态 LINQ to Entity 在运行时指定 OrderBy 属性 但是 当使用大多数文档中描述的代码时 var query context Customer OrderBy Name 我收到以下异常 Sys
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • ORDER BY 之后的 GROUP BY

    我需要去做GROUP BY after ORDER BY 我不明白为什么 MySQL 不支持这一点 这是我的代码 SELECT pages id contents id language ORDER BY FIND IN SET langu
  • 自动创建n列表

    我想在一行中将 236 个 int 值存储到 sql 中 现在我必须声明该表 但我不想输入 236 倍的列名 列名应该是 BYTE001 BYTE002 或其他前缀 如 BYTE B INT 可以自动生成ColumnNames吗 我尝试以下
  • PHP、PDO 和 SQLSRV 对一个 INSERT 语句执行多次

    我已经在 MySQL 和 Apache 服务器上使用 PDO 和 PHP 一段时间了 我最近的任务是将企业的旧 Web 应用程序转换为新设置 旧设置是标准 Linux Web 堆栈 Apache PHP MySQL Filezilla 新设

随机推荐

  • jqGrid 在第一次加载时排序

    我的网格有以下代码 我使用与数据源位于同一目录中的 XML 文件 var handsetGrid products jqGrid url catalog xml datatype xml colNames SKU Name Brand De
  • 操作错误:没有这样的表

    所以我正在开发我的应用程序 并向我的模型添加了一个 slugfield 然后像往常一样继续makemigrations 并且出现了巨大的红色错误墙 Traceback most recent call last File C Users A
  • 在开始编码之前如何规划我的基于网络的项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我和我的朋友开始作为合作伙伴一起工作 我们决定制作一个又一个的 Kick as 网站 我们写下了大约 100 个想法 是的 我们首先在
  • 如何在 python 中解压非常大的文件?

    使用 python 2 4 和内置ZipFile库 我无法读取非常大的 zip 文件 大于 1 或 2 GB 因为它想要将未压缩文件的全部内容存储在内存中 是否有另一种方法可以做到这一点 使用第三方库或其他一些黑客 或者我必须 掏出 并以这
  • Enzyme:如何测试作为 prop 传递的 onSubmit 函数?

    我对酶还很陌生 我有两个正在测试的组件 form jsx const LoginForm style handleSubmit gt return
  • 时间:2019-05-09 标签:c#sizeofdecimal?

    不清楚十进制类型的 sizeof 字节大小是否会像 SQL Server 中那样因精度而变化 C 类型的精度变量是 十进制 吗 我不想打开不安全代码来仅对十进制类型调用 sizeof 你会如何处理这个问题 十进制关键字表示 128 位数据类
  • 是否可以将 REST 和消息传递结合起来用于微服务?

    我们拥有基于微服务架构的应用程序的第一个版本 我们使用 REST 进行外部和内部通信 现在我们想从CP CAP定理 切换到AP 并使用消息总线进行微服务之间的通信 关于如何基于Kafka RabbitMQ等创建事件总线的信息有很多 但我找不
  • 如何在 Python 中使用 M2Crypto 重新创建以下签名命令行 OpenSSL 调用?

    这在命令行中完美运行 我想在 Python 代码中使用 M2Crypto 执行相同的操作 openssl smime binary sign signer certificate pem inkey key pem in some file
  • BLE血糖仪

    我正在尝试从血糖仪获取数据 但无法在互联网上找到有关实施的良好资源 这是我到目前为止能够实现的 我正在使用 BluetoothAdapter LeScanCallback 接口扫描设备 Override public void onLeSc
  • 如何下载地图选定部分的 OSM 图块

    我想使用 Openlayer OSM 图层以单个缩放级别离线下载地图的选定部分的地图 我有地图的四个角 即地图的显示部分 但需要获取所有图块图像或四个角之间的图块 我回顾了一些例子 Openlayers获取鼠标下图块的图片url https
  • 在.NET 4中使用await SemaphoreSlim.WaitAsync

    我的应用程序正在使用 NET 4 我正在使用等待异步努吉特包 https www nuget org packages Microsoft Bcl Async 在我的应用程序中 我想对信号量 WaitAsync 调用进行等待 如下所示 Se
  • 为什么 GHC 不能派生 Monoid 的实例?

    GHC 有一些语言标志 例如DeriveFunctor DeriveDataTypeable等等 这使得编译器能够为 Haskell 98 中允许的类型类之外的类型类生成派生实例 这对于类似的东西尤其有意义Functor 其中该类的定律规定
  • 绘制包含多个组件的图形时,节点大小不正确

    我有一个包含许多组件的图表 我想将其可视化 作为一个特殊特征 巨型组件中节点的节点点应随其特征向量中心性缩放 所有其他节点具有相同的大小 我使用以下脚本 import networkx as nx import pylab as py im
  • android recyclerview:如何以编程方式选择 TextView 背景颜色?

    我有一个 CardViews 的 RecyclerView 列表 在每个 CardView 上 用户事先从下拉对话框中选择 类型 类型选择有 工作 和 家庭 类型选择作为字符串存储在 SQLite 数据库中 当我运行应用程序时 没有显示 T
  • 角度单元测试:错误:无法匹配任何路由。 URL 段:“主页/顾问”

    我正在我的 Angular 4 0 0 应用程序下进行单元测试 我的真实组件中的某些方法是通过以下方式调用手动路由 method this navigateTo home advisor with 导航是一个调用此的自定义路由方法 publ
  • 使用不区分大小写的字符串访问 python 字典

    我正在努力查看是否存在一种方法来访问带有正确字符串但不区分大小写的字符串作为键的 python 字典 例如使用以下代码 dictionary one 1 two 2 three 3 list One second THree for ite
  • Firebase 仪表板设置电子邮件已验证

    我通过控制台创建了一个用户 并在我的客户端 iOS 应用程序 内创建了一个用户 我要求用户在使用之前验证其电子邮件 但是测试用户没有有效的电子邮件 它不存在 电子邮件是 email protected cdn cgi l email pro
  • 如何从SWT表中选择一个单元格

    table addSelectionListener new SelectionAdapter public void widgetSelected SelectionEvent e if table getSelectionIndex 1
  • SQL - 将 2 个外键左连接到 1 个主键

    我有两张桌子 游戏桌和团队桌 我的 sql 语句应该是什么样子来创建一个游戏列表 以提取链接到 TeamID1 和 TeamID2 字段的 TeamName 我相信我可以使用左连接 但我不确定如何处理链接到一个主键的两个外键 非常感谢您提供
  • 从审计记录构建快照表

    我有一个Customer表具有以下结构 CustomerId Name Address Phone 1 Joe 123 Main NULL 我也有一个Audit跟踪更改的表Customer table Id Entity EntityId