问题标签 [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.
sql - SCD 类型 2 的 SQL 查询
我收到下表,但存在以下问题:
从数据集中创建一个渐变维度类型 2。EMPLOYEE 表有每个员工的每日记录。类型 2 - 将具有有效数据和到期日期。
员工ID | 日期 | 姓名 | 经理编号 |
---|---|---|---|
123 | 1-3月 | 约翰·史密斯 | 1 |
123 | 3月2日 | 约翰·史密斯 | 1 |
123 | 3-3月 | 约翰·史密斯 | 2 |
123 | 3月4日 | 约翰·史密斯 | 3 |
123 | 3月5日 | 约翰·史密斯 | 3 |
我相信我的目标表应该是这样的:
员工ID | 姓名 | 经理编号 | 生效日期 | 截止日期 |
---|---|---|---|---|
123 | 约翰·史密斯 | 1 | 1-3月 | 3-3月 |
123 | 约翰·史密斯 | 2 | 3-3月 | 3月4日 |
123 | 约翰·史密斯 | 3 | 3月4日 | 无效的 |
我尝试了以下查询:
我的结果表如下:
员工ID | 姓名 | 经理编号 | 生效日期 | 截止日期 |
---|---|---|---|---|
123 | 约翰·史密斯 | 1 | 1-3月 | 无效的 |
123 | 约翰·史密斯 | 1 | 无效的 | 3-3月 |
123 | 约翰·史密斯 | 2 | 3-3月 | 3月4日 |
123 | 约翰·史密斯 | 3 | 3月4日 | 无效的 |
123 | 约翰·史密斯 | 3 | 无效的 | 无效的 |
有谁知道我可以改变我的查询以实现我的目标表,基于我迄今为止所取得的成就?我不知何故只需要产生 3 个经理 ID,但 distinct 不起作用。此外,我需要找到一种方法来组合每个经理 ID 的生效日期和到期日期。任何帮助都将不胜感激。
sql - 在 PostgreSQL 中使用“创建规则/触发器”实现 SCD2
我想在 postgreSQL 中实现 SCD2。现在,我正在尝试使用“创建规则”,因为我想根据临时表(例如,截断和加载的 STG)更新主表(例如 MAIN)。
因此,每当临时表 (STG) 中有插入时,应自动执行以下操作。
如果它的新记录(存在于 STG 但不在 MAIN 中)插入到 MAIN/主表 (MAIN),则设置 flag=1。
并且低于 2 个 sqls i。如果主表 (MAIN) 已经存在于阶段表 (STG) 中,则更新其非键记录并设置活动标志 =1。ii. 将旧记录标记为非活动可能在 MAIN 表中将标志设置为 0。
我正在尝试下面的东西,但它不起作用。请提出更好的方法/正确的 SQL。它可以与规则/触发器一起使用。
谢谢你。
sas - 在 SAS AML 方帐户桥接表中,如果错误的日期数据已加载核心,那么我该如何解决?
我已经用 1jun 数据加载了派对和账户主数据。现在应该为理智的 1jun 加载当事人到帐户的桥梁。但我已经加载了 2jun 数据。现在我该如何解决它。如果我删除更改开始日期为 2jun 的记录,是否正确?不会有影响吗?
sql - 每天在 SCD-2 中更新约 3000 万条记录
我有一个包含 400M+ 记录的 SCD-2 表。每天我都会获得 40M 条记录,其中约 20M 被插入和更新。我在这个项目中使用 Talend & Oracle。问题是更新这个数量的记录需要很多时间(很多小时)。我的 SCD-2 目标表结构如下:
主键 - Skey、as_of_date、primary_country 和(每月)按 as_of_date(每日处理日期)分区。如何提高作业的性能以便能够更快地更新目标表中的记录?
我尝试在 TEMP 阶段表中插入所有要更新的数据,然后使用 MERGE 更新目标表中的记录。此外,我在阶段和目标表之间使用内部连接运行了一个更新语句,但我仍然看到性能不佳。目标表在 as_of_date 上建立索引,在 primary_country 和 end_date 上建立聚集索引。
使用的查询是:
我对编写存储过程的了解较少。谁能帮助我应该做些什么来改善这一点,我做错了什么?
database - 数据建模中的 SCD-2:如何检测变化?
我知道 SCD-2 的概念,并且我正在尝试通过一些练习来提高我的技能。
我有下一个场景/实验:
- 我每天都调用一个休息 API 来提取有关公司的信息。在我对数据库的初始加载中,一切都是新的,所以一切都很容易。
- 第二天我调用相同的 rest API,它可能返回相同的公司,但其中一些可能有(或没有)一些变化(即,它们改变了规模、利润、位置……)
我知道如果其余 API 只返回有更改的记录,SCD-2 可能真的很简单,但在这种情况下,它也可能返回没有更改的记录。
在这种情况下,人们如何检测公司的数据是否发生变化以应用 SCD-2?,他们是否比较所有字段?
有没有我可以看到的例子?
sql - SCD 2 记录更改
我正在处理来自 API 的数据。
用例如下
API DATA 来的第一天
第二天,同样的记录带来了一些变化
用例
- POS NAME, REFERENCE 的更改可以在同一记录中更改另一天
现在第一条记录来自 API 的第一天,开始日期和结束日期 = NULL
这意味着它是一个活动记录。
第二天,具有相同 ID 的记录,POS_SRC_ID 相同,但记录有一些变化,并带有更新的开始日期。
要求是我们必须维护历史记录并更新 END DATE 的旧记录
ie - 这应该是我们更新旧记录的方式
ID POS_SRC_ID POS_NAME REFERENCE START DATE END DATE
3908 543211 TEAM LEAD BI/UG 3/5/2020 28/5/2020 ----更新
3908 543211 TEAM LEAD BI/US 28/5/2020 NULL --- 插入记录
请帮助解决这个问题,因为我一直在尝试实施 MERGE LOGIC 但没有成功。
sql - 使用 SCD2/4 实施修订
我正在开展一个项目,该项目是一种需要支持组件修订的物料清单管理器。经过一些研究,我偶然发现了缓慢变化的尺寸类型 2 和类型 4,这似乎是这个用例中最合适的模式。
但是,我对几个概念有点困惑:
如果我想实现 SCD 类型 2,组件表是否会有额外的列用于start_date
、end_date
、active
?或者,类型 2 是否会添加一个与附加列具有revisions
相同结构的表,而类型 4 是否会添加一个表和一个表?components
revisions
revisions_history
任何帮助将不胜感激!
azure-synapse - 如何使用 Azure Synapse Serverless SQL 池在 Azure Data Lake Gen2 中创建空白的“Delta”湖表架构?
我有一个文件,其中包含使用 Azure 映射数据流从 2 个不同来源集成的数据并加载到 ADLS2 数据湖容器/文件夹中,例如:- /staging/EDW/Current/products.parquet 文件。
我现在需要使用 Azure 映射数据流在暂存中处理此文件,并使用 SCD type2 方法将其加载到相应的维度表中以维护历史记录。
但是,我想尝试仅使用 Azure 映射数据流在 Azure Data Lake 中将此维度表创建和处理为“Delta”表。但是,由于 SCD 类型 2 需要源查找来检查是否存在任何现有记录/行以及是否插入全部或更改的记录是否进行更新等(假设在第一次加载期间)。
为此,我需要首先在 Azure 数据湖文件夹中创建一个默认/空白“Delta”表,例如:-/curated/Delta/Dimension/Products/。就像我们在 Azure SQL DW(专用池)中所做的那样,我们可以首先创建一个只有架构/结构而没有行的空白 dbo.dim_products 表。
我正在尝试通过利用和评估使用 Azure 映射数据流的 Delta Lake 和 Azure Synapse Serverless SQL 池的最佳功能来实现 DataLake-House 架构实现——以提高性能、节省成本、易于开发(低代码)和理解。但是,与此同时,此时要避免使用逻辑数据仓库 (LDW) 类型的架构实现。
为此,尝试在内置的 Azure Synapse Serverless SQL 池下创建一个新数据库,定义数据源、格式和一个空白的增量表/模式结构(没有任何行);但没有运气。
但是,这会失败,因为 Delta 表/文件需要存在维护事务日志的_delta_log/*.json文件夹/文件。这意味着,我必须首先将少量(虚拟)行以 Delta 格式写入所述目标文件夹,然后只有我可以读取它并执行用于 SCD 类型 2 实现的以下查询:
任何想法,意见,建议?
谢谢!
database - 处理 SCD 类型 2 中的删除
作为一名建模者,试图找出在 SCD 类型 2 表中处理删除的最佳方法是什么。
根据原则,SCD 类型 2 表使用 START_DT 和 END_DT 等 ETL 日期来跟踪更改。
- START_DT 将是记录生效的日期。
- END_DT 将是它更改为另一种形式的日期或 Null/High Date 以表示当前版本的记录。
- 在所有时间点,对于键组合,都会有一个当前版本记录,其 END_DT 为空日期或高日期。
现在,如果从源中删除记录,下面的最佳选择是什么,
- 如果从源中删除记录,则有额外的列,如 SRC_DELETE_IND,默认设置为“N”和“Y”。
- 与 1 相同,但在 Delete Came 时插入新的重复行。
- 而不是 SRC_DELETE_IND 记录的过期/结束日期
但是这里我们现在没有打开记录了。
如果记录重新出现在 Source 中并声明为不正确删除,则会增加复杂性。让我们在 10 日说,对于选项 1,数据看起来像,
对于选项 2
对于选项 3
哪个选项更有意义,并且符合 DWH 最佳实践。
sql - SCD Type-2 使用 INSERT 策略
我正在使用 Data Vault 2.0 模型。在这里,我们不应该在表中使用 UPDATE。通常在 RDBMS 中,我们使用 UPDATE & INSERT 策略来实现 SCD-2。但就我而言,我只能使用 INSER 策略。我的源是 Kafka 输入,它被加载到雪花中(作为 avro 格式),我正在展平并将其加载到另一个 RDBMS 格式的表中。
我的问题是:谁能帮我在不使用 UPDATE 的情况下实现 SCD 类型 2 逻辑。只有使用 INSERT 策略我必须这样做。
我也应该保留历史。例如,如果我在区间-a 和区间-b 中得到 rec-1,我得到了 rec-1 的 2 次更新,那么我需要在我的目标中加载所有三个记录,指向最后一条记录将是最新的一。