处理Datawarehouse中的空值

rry*_*man 6 sql ssas ssis data-warehouse

我想问一下你在输入数据仓库和SSIS/SSAS时处理空数据或空数据的最佳实践.

我有几个事实和维度表在不同的行中包含空值.

具体细节:

1)处理空日期/时间值的最佳方法是什么?我应该在我的时间或日期维度中创建一个"默认"行,并在找到空值时将SSIS指向默认行吗?

2)处理维度数据中的空值/空值的最佳方法是什么.例如:我在"帐户"维度中有一些行,其帐户名称列中包含空(非NULL)值.我应该将列中的空值或空值转换为特定的默认值吗?

3)与上面的第1点类似 - 如果我最终得到一个在其中一个维度列中没有记录的Facttable行,我该怎么办?如果发生这种情况,我是否需要每个维度的默认维度记录?

4)关于如何在Sql server集成服务(SSIS)中处理这些操作的任何建议或提示?要使用的最佳数据流配置或最佳转换对象会很有帮助.

谢谢 :-)

Ste*_*mer 4

正如前面的答案所述,维度的空值可能有许多不同的含义,未知、不适用、未知等。如果能够在应用程序中区分它们,添加“伪”维度条目会有所帮助。

在任何情况下,我都会避免使用空事实外键或维度字段,即使有一个“未知”维度值也将帮助您的用户定义包含包罗万象的分组的查询,其中数据质量不是 100%(并且它从来没有)。

我一直在使用的一个非常简单的技巧是使用 T-sql 中的 int IDENTITY(1,1) 定义维度代理键(从 1 开始,每行增加 1)。伪键(“不可用”、“未分配”、“不适用”)被定义为负整数,并由在 ETL 过程开始时运行的存储过程填充。

例如创建的表为


    CREATE TABLE [dbo].[Location]
    (
        [LocationSK] [int] IDENTITY(1,1) NOT NULL,
        [Name] [varchar](50) NOT NULL,
        [Abbreviation] [varchar](4) NOT NULL,
        [LocationBK] [int] NOT NULL,
        [EffectiveFromDate] [datetime] NOT NULL,
        [EffectiveToDate] [datetime] NULL,
        [Type1Checksum] [int] NOT NULL,
        [Type2Checksum] [int] NOT NULL,
    ) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

以及一个填充表的存储过程


Insert Into dbo.Location (LocationSK, Name, Abbreviation, LocationBK, 
                      EffectiveFromDate,  Type1Checksum, Type2Checksum)
            Values (-1, 'Unknown location', 'Unk', -1, '1900-01-01', 0,0)
Run Code Online (Sandbox Code Playgroud)

我制定了一条规则,每个维度至少有一个这样的伪行,用于维度查找失败的情况,并构建异常报告来跟踪分配给此类行的事实数量。