【问题标题】:Data cube design: hard-to-aggregate measure数据立方体设计:难以聚合的度量
【发布时间】:2012-08-01 15:20:15
【问题描述】:

我正在为数据立方体设计事实表,并且我有一个我真的不知道如何正确聚合的度量。以下 SQL 代码将创建一个小样本事实表和维度表:

create table FactTable (
    ID      int,
    Color   int,
    Flag    int)

insert into FactTable (ID, Color, Flag) values (1, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (1, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (1, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (2, 'RED',   0)
insert into FactTable (ID, Color, Flag) values (2, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (2, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (3, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (3, 'WHITE', 1)
insert into FactTable (ID, Color, Flag) values (3, 'BLUE',  1)

create table ColorDim (
    CID     int, 
    Color  int)

insert into ColorDim (CID, Color) values (1, 'RED')
insert into ColorDim (CID, Color) values (2, 'WHITE')
insert into ColorDim (CID, Color) values (3, 'BLUE')

FactTable 和 ColorDim 在 FactTable.Color = ColorDim.Color 上连接。在立方体中,应该有一个称为“爱国”的度量,它计算对象 ID,包括红色、白色或蓝色(至少一种颜色)。期望的输出如下:

  • 在浏览立方体时,如果用户拉入爱国措施(不拉任何维度),则显示的总数应为 2,因为有 2 个 ID(即 1 和 3),其中至少包含三种颜色中的一种.请注意,ID 1 应该为总爱国值贡献 1,即使它有两种颜色。
  • 如果用户按颜色维度浏览爱国度量,他们应该会看到如下表。请注意,ID 1 对 RED 计数贡献 1,对 BLUE 计数贡献 1。

    +--------+------------+
    |颜色 |爱国 |
    +--------+------------+
    |红色 | 2 |
    |白色 | 1 |
    |蓝色 | 2 |
    +--------+------------+

(我尝试使用this web app 创建表格,但间距似乎不正确。希望它的可读性足以理解。)

我确信这是一个非常基本的多维数据集设计情况,但我之前没有过多地使用多维数据集,我使用的度量通常是简单的列 SUM 或列 SUM 的乘积等。任何帮助将不胜感激。

(如果相关,我将在 MS SQL Server 2008 中运行用于构建事实/维度表的 SQL 查询,并将在 MS Visual Studio 2008 中设计多维数据集本身。)

【问题讨论】:

  • 你能发布一个期望结果的样本吗?很难从单词问题中破译。
  • 这不是主题,但我只是想指出,事实表具有维度表的代理键而不是实际值(例如“RED”)是一种更好的做法, WHITE'等。您应该获得更好的性能,如果您决定重命名其中一个维度值,您将不必更新事实。所以 FactTable 应该有 CID vs. Color。
  • +1 Dmitriy 你打败了我。 @Andy E,为什么不在事实表中存储 CID 而不是 Color?此外,CID 可以是 smallint 或 tinyint。事实表应尽可能精简,因为它通常有数百万或数十亿行。
  • 事实表将链接到 int 或 smallint ID 上的维度表,而不是 varchar 值。出于示例的目的,我只是希望事实表尽可能清楚地包含所有信息。

标签: sql sql-server sql-server-2008 ssas


【解决方案1】:

我会试一试,虽然我不是 100% 确定我理解这些问题。此外,我不想将查询发布到 cmets 以验证它们是否有效。如果我离题而且这没有帮助,我会删除答案。

在浏览立方体时,如果用户拉入爱国度量(不拉任何维度),则显示的总数应为 2,因为有 2 个 ID(即 1 和 3)至少包含三种颜色中的一种.请注意,ID 1 应该为总爱国值贡献 1,即使它有两种颜色。

WITH MyCTE (id, Count)
AS
(
select id, count(flag) as count
from FactTable
where Flag=1
group by id
having COUNT(flag) >=2
)
select COUNT(*) from MyCTE

如果用户按颜色维度浏览爱国度量,他们应该会看到如下表。请注意,ID 1 对 RED 计数贡献 1,对 BLUE 计数贡献 1。

select a.Color, COUNT(*)
from FactTable a
    join ColorDim b
    on a.Color = b.Color
where Flag = 1
group by a.Color

【讨论】:

  • 感谢您试一试。不幸的是,我希望在数据立方体中定义一个度量,该度量将在两种输出情况下都正确计算。我不是在寻找可以提取数据的单个 SQL 查询。
【解决方案2】:

不完全确定为什么您的事实表需要是“ID”和“颜色”之间的交叉连接。您可以简单地消除所有 Flag=0 行并使用 ID 列的简单计数作为您的 Patriotic 度量,不同的计数将为您提供 Patriotic 行的总数。

您也不需要颜色维度,因为 ColorDim 表没有提供额外信息。

但是,如果将更多颜色添加到行中,您将能够将“爱国”标志添加到 ColorDim 表中。然后,任何查询都可以通过“Patriotic”标志进行过滤,并且仍然可以获得 Patriotic 行的准确计数。

create table FactTable (
    ID      int,
    Color   int
    )

insert into FactTable (ID, Color) values (1, 'RED')
insert into FactTable (ID, Color) values (1, 'BLUE')
insert into FactTable (ID, Color) values (2, 'BLUE')
insert into FactTable (ID, Color) values (3, 'RED')
insert into FactTable (ID, Color) values (3, 'WHITE')
insert into FactTable (ID, Color) values (3, 'BLUE')

   create table ColorDim (
        CID     int, 
        Color  int,
        PatrioticFlag int
    )

insert into ColorDim (CID, Color) values (1, 'RED',1)
insert into ColorDim (CID, Color) values (2, 'WHITE',1)
insert into ColorDim (CID, Color) values (3, 'BLUE',1)
insert into ColorDim (CID, Color) values (4, 'BEIGE',0)

【讨论】:

  • 为了保持我的示例小,我只在示例中包含了这些列。但是还有其他列,在“颜色”级别上携带数据。所以我不能只去掉 ID 1, Color 'WHITE' 行;除了爱国旗帜之外,它还有其他数据。不过,感谢您的回复。
【解决方案3】:

我终于明白了。首先,我在包含该 ID 的预聚合数据的事实表中为每个 ID 添加一行,因此事实表变为:

create table FactTable (
    ID      int,
    Color   int,
    Flag    int)

insert into FactTable (ID, Color, Flag) values (1, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (1, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (1, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (1, 'PATRIOTIC',  1)
insert into FactTable (ID, Color, Flag) values (2, 'RED',   0)
insert into FactTable (ID, Color, Flag) values (2, 'WHITE', 0)
insert into FactTable (ID, Color, Flag) values (2, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (2, 'PATRIOTIC',  1)
insert into FactTable (ID, Color, Flag) values (3, 'RED',   1)
insert into FactTable (ID, Color, Flag) values (3, 'WHITE', 1)
insert into FactTable (ID, Color, Flag) values (3, 'BLUE',  1)
insert into FactTable (ID, Color, Flag) values (3, 'PATRIOTIC',  1)

同理,在颜色维度表中添加一行:

create table ColorDim (
    CID     int, 
    Color  int)

insert into ColorDim (CID, Color) values (1, 'RED')
insert into ColorDim (CID, Color) values (2, 'WHITE')
insert into ColorDim (CID, Color) values (3, 'BLUE')
insert into ColorDim (CID, Color) values (4, 'PATRIOTIC')

然后,在 MS Visual Studio 中,将 Color Dimension 中 Color 属性的 DefaultMember 属性编辑为:

[Color Dimension].[ColorDim].&[PATRIOTIC]

DefaultMember 属性告诉 MS Visual Studio,事实表中具有颜色“PATRIOTIC”的行已经是具有相同 ID 和其他颜色值的其他行的聚合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多