【问题标题】:Generate list of distinct dimensions in a table在表中生成不同维度的列表
【发布时间】:2021-12-08 11:13:53
【问题描述】:

我有一张有 3 个维度的表格 - A、B 和 C。 我基本上想要这些维度的所有可能组合的值,并在组合不存在时将所有度量 (M) 填充为 0。

假设我有桌子-

如果我这样做,我会得到 -


select a,b,c from sum(m) fact group by a,b,c

但我想要所有可能的组合,-

目前,我正在执行如下所示的交叉连接,但是否有更快的方法来执行此操作(因为我的表有大约 1M 条记录)? -

select * from (
select distinct f1.a, f2.b, f3.c 
from fact f1 
cross join fact f2 
cross join fact f3 ) all
left join 
( select a,b,c from sum(m) fact group by a,b,c) s
on all.a=s.a and all.b=s.b and all.c=s.c

【问题讨论】:

  • 你的数据库是什么? MySQL 不是 Oracle,Oracle 也不是 MySQL。它们在功能上都不同。只要您标记了 DWH,我认为这实际上是 Oracle,但请删除不相关的标签。

标签: mysql sql database oracle data-warehouse


【解决方案1】:

如果这是 Oracle 数据库,那么这正是 cube 的用途。

select a, b, c, sum(m) 
from my_table 
group by cube(a,b,c)

【讨论】:

  • cube 不会生成源数据中不存在的组合。它生成所有可能的维度排列,而不是值。您可以在db<>fiddle 中查看它:没有(1,2) 元组
【解决方案2】:

MySQL:

GROUP BY a,b,c 将为表中存在的每个组合生成 1 行。

如果您想要所有可能的组合,则需要再构建 1(或 3)个表来列出所有可能的值,然后从它们中执行 LEFT JOIN。您可能还希望 COALESCE(col, 0)NULLs 变为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-06-16
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多