问题标签 [scd2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1808 浏览

sql-server - 如何在 SQL Server 中的条件匹配时更新和插入新记录

我在 SQL Server 中编写了一个存储过程。基本上它会尝试处理 SCD2。我正在尝试做三件事:

  1. 当目标不匹配时,插入记录
  2. 当源不匹配时,停用活动记录(更新)
  3. 匹配时,将活动记录标志更新为 N

这 3 种情况正在得到妥善处理。

我的问题是匹配时我还需要在源中插入一条新记录。我有一些文章建议使用$output子句并在上面插入MERGE;我试过了,但我得到了这个错误:

消息 356,级别 16,状态 1,过程 myscd2,第 17
行当 FROM 子句包含嵌套的 INSERT 时,INSERT 语句的目标表“dbo.dimproducts”不能位于(主键、外键)关系的任一侧, UPDATE、DELETE 或 MERGE 语句。找到参考约束“FK_FactSalesOrders_DimProducts”。

请在下面查看我的代码并告诉我,我可以做些什么来解决这个问题:

0 投票
2 回答
733 浏览

sql - 如何在缓慢变化的维度和事实中跟踪合并

在 2 个或 3 个或更多维度合并以形成新维度的数据集市中。如何管理 scd 以跟踪历史上的所有合并并呈现与这些维度相关的趋势事实?

一个具体的例子是三个商店(业务 ID 8897、8965、9135)合并以创建一个新的商店业务 ID 9700。如何从事实表中获取历史销售数据以显示直到给定日期 8897、8965 和 9135是单独的商店,现在都是新的商店 9700。

此外,如果新店的营业编号不是 9700,但新店采用以前的商店营业 ID 之一怎么办。因此,新的合并商店业务 ID 不是 9700,而是 8897。

SurrogateKey -------- StoreBusinessID---------- StoreName
=============== ============== ===== ===================

=================================================== ==

0 投票
1 回答
141 浏览

sql-server - 如何在 SQL 中创建 ValidTo 列(SCD 类型 2)

我有这个任务:对于这个任务,在提供的数据集中使用下表: [Employee](包含所有员工的每个职位的名称和开始日期,业务键唯一标识每个员工) [Position](包含每个员工的级别名称position) 创建一个返回以下列的 sql 语句

[ValidTo] 列必须符合以下规则: 1) 值必须是下一个仓位开始日期的前一天(无重叠,仓位历史中无“漏洞”) 2) 最后仓位应视为未平仓并给予默认结束日期

额外问题:识别数据集中的数据质量问题

一些记录:


先感谢您!

0 投票
1 回答
244 浏览

ssis - SSIS 中的 SCD2 始终将所有记录视为新记录

这是我的问题:我想构建简单的 ETL 流程,在数据流中我从我的暂存模式中获取一些数据并将它们加载到其他地方。我还需要在那里实现 SCD2。所以理论上听起来很简单——但 SSIS 中的 SCD 组件总是将记录视为新记录,因此每次我执行任务时,即使源数据没有任何变化,它也会将相同的数据加载到我的目标表中。

在 SCD 组件的配置中,我将 BusinessKey 分配给无法更改的列数据,我选择维度列的其余部分作为 HistoricaAtributes,设置开始日期和结束日期。推断的成员支持未选中。

我正在使用 SSDT 2015,数据库引擎是 SQL Server 2016

这是带有 ETL 的屏幕:

ETL

关于如何解决这个问题的任何建议?

0 投票
1 回答
1266 浏览

google-bigquery - google bigquery中的scd2表实现

我正在尝试在 BigQuery 中创建一个 SCD(缓慢变化的维度)类型 2 表,而不使用任何 DML

测试架构:

id | date | name | valid_from | valid_to | flag

我需要捕获特定的名称更改id

谢谢,

0 投票
3 回答
1196 浏览

sql-server - 维护父子表的历史数据变化

1 位员工有 N 个地址。在这里,如果这两个表中的任何用户进行了任何更改,我需要维护 Employee 和 Address 更改的历史信息。

表员工:

地址表:

上面,EmpID 是 Employee 表的外键

我必须满足的场景:

  1. 我应该能够跟踪任何员工的个人地址(子表记录)记录的变化。
  2. 我应该能够使用子地址记录跟踪员工(父表记录)的更改。

我想到了以下方式:假设,最初它处于下图所示的状态 在此处输入图像描述

解决方案1:

案例:当子表更新时,我更新了 Add0001 地址记录,因此我在地址表中插入了一条新记录,使之前的记录无效: 在此处输入图像描述

案例:当父表现在更新时,当父表更新时,我有父表的历史表,我将旧数据移动到历史表并将当前记录更新到父表中,如下所示: 在此处输入图像描述

解决方案 2:

案例:当子表更新时与解决方案1中的相同

案例:当父表更新时

我们在父表中插入一条新记录,使以前的记录处于非活动状态。在这种情况下,我们获得了一个新 ID,并且该 ID 更新为子表的外键,如下所示:

在此处输入图像描述

这是一起维护父子表历史数据的最佳方式吗?或者有什么办法可以保留设计,以便我应该能够完全跟踪父子记录数据的变化?

0 投票
1 回答
1162 浏览

sql-server - 使用 BINARY_CHECKSUM 的 T-SQL 类型 2 SCD

我正在尝试为我在 T-SQL 中的工作实现类型 2 SCD。我正在遵循此链接中给出的绝妙方法:https ://www.mssqltips.com/sqlservertip/2883/using-the-sql-server-merge-statement-to-process-type-2-slowly-changing-方面/

但是,在我的情况下,表中没有内置 BinaryCheckSum 列。我需要即时计算相同的值。我将在下面发布我的代码(创建了一些示例数据)以实现此实现。

有人可以让我知道这种方法是否有效吗?还是我需要在列本身中有 DimensionCheckSum?另外,就我而言,我不需要代理 ID。(请原谅任何语法错误)

0 投票
0 回答
757 浏览

ssas - 如何在具有 1:M 关系的两个 SCD Type2 表之间的 Analysis Services“表格”模型中创建/处理复杂的连接条件?

我是 Analysis Services 的新手,正在从事表格模型设计。需要有关最佳方法以及如何处理以下情况的专家意见/建议。

假设,我有以下两个表 Department 和 Employee,我在其中存储不同客户(租户)的数据,并且这两个表之间存在一对多 (1:M) 关系(即一个部门可以有 1 个或多个员工)

但是,假设这两个表都是 SCD 类型 2,即存储具有生效日期和终止日期的历史记录。在数据库级别的这些表上没有创建任何约束、索引等。

列 cust_id 和 dept_id 可以连接在一起作为两个表中的单独列作为键字段,并用作两个表之间的连接。

部门键=连接(部门[cust_id],部门[dept_id])

员工键=连接(员工[cust_id],员工[dept_id])

示例键输出值 = 1001D1、1001D2、1002D3、1002D4

现在假设我们有以下报告要求,即

过滤日期范围(在可视化中) - 假设有另一个包含所有日期和层次结构的日期维度表

1) 当没有选择特定日期范围或过滤器时 - 显示所有当前活动的员工和部门名称(其中,trmntn_dt = 12-31-9999)
因此,预期输出为:

Emp Name 部门名称
XYZ-A IT
ABC HR
AXBYCZ Finance

2) 在报告特定月份示例时 - 2019 年 1 月 - 显示截至该月活跃的所有员工和部门名称。所以,预期的输出是:

Emp Name 部门名称
XYZ IT

3) 在报告特定季度示例时 - 2019 年第一季度 - 显示截至该季度活跃的所有员工和部门名称。所以,预期的输出是:

Emp Name 部门名称
XYZ-A IT
ABC HR
AXBYCZ HR+Admin

但是,在这两个表之间具有 1:M 关系的 AS 表格模型中的连接条件将失败,因为在关系的一侧的 Department 表(D3 的行)中的行不是唯一的。

如果在两个表的连接连接条件中也包含 efctv_dt 或 trmntn_dt 作为连接键,即

部门键=连接(部门[cust_id],部门[dept_id])和连接(部门[efctv_dt],””))

员工键=串联(员工[cust_id],员工[dept_id])和串联(员工[efctv_dt],””))

示例键输出值 = 1001D112-01-2018、1001D201-01-2019…</p>

但是,尽管现在行将是唯一的,因为我们不希望同一行在同一天两次(除非某些 ETL 问题,例如进程在同一天运行两次等)

AS 表格模型不允许创建复杂的连接/条件(如在 SAP BO Universe 中),因此我们可以在连接这两个 SCD 类型 2 表时添加以下条件,如下所示,这可能有助于解决一些要求。

我认为创建/计算任何度量值仍然可以使用 DAX 上的许多在线示例,但是仅使用维度属性呢?

这是正确的方法吗?如何处理这些?

0 投票
1 回答
767 浏览

data-warehouse - SQL Server scd2 和 scd1 中的 DWH SCD 类型 2 实现

我们正在实施一个新的 dwh 解决方案。我有许多维度需要慢慢改变类型 2 属性。我正在考虑在我的维度中实现类型 2 和类型 1 属性的组合。对于某些维度属性,我们通过在暗表(Type2)中插入新行来跟踪历史,对于其他属性,我们将只更新现有行以进行任何更改(Type1)

问题

  • 这是一个好习惯吗?可以将 SCD 1 和 2 组合用于相同的暗淡吗?

  • 维度中 SCD 2 属性的数量是否有限制?我的维度很宽,比如 300 列,其中一位用户要求 scd 类型 2 跟踪大约 150 列。在暗淡中有这么多 scd2 属性可以吗?因此,是否会对多维数据集和仪表板等下游报告 BI 解决方案的性能产生任何影响?

  • 在 OLTP 系统中,我们维护一个“审计”表来记录任何更新。尽管这不是一种非常容易查询的格式,但我们得到了与此更改相关的大多数问题的答案。我们不需要太多关于数据变化的报告。当然,有一些重要的列,比如Status我们肯定需要 SCD2,但其余列,我不确定 DWH 中许多其他列的历史是否会增加任何价值。我的问题是当我们在 OLTP 中有这个审计表时,我如何确定 DWH 中哪些属性需要 SCD 2?

0 投票
2 回答
388 浏览

scala - 如何为连续运行中生成的连续数据框列生成连续唯一 ID

我正在使用 Spark Scala 中的 SCDTYPE2,因此我的代码每天都会创建新的数据框,并且我需要知道如何在每天创建数据框时使用新的唯一 ID 进行标记

我已经尝试过monotonically_increasing_id()创建唯一 ID 的功能。但它在每个数据帧中生成唯一的 id。但它对于每次运行都不是唯一的。每次运行都会重复相同的唯一 ID。

此外,我尝试在我的数据框中使用时间戳列创建唯一 id,monotonically_increasing_id但它以双精度数据类型提供输出,我已转换回整数/字符串,但它对 id 进行舍入并生成重复的 Id。

我希望无论数据帧的生成如何,都应该生成唯一的 id。如果有人能指出我正确的方向,那将很有帮助。