SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?
Posted
技术标签:
【中文标题】SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?【英文标题】:SQL Query Optimization: what is the best approach to use same metric twice in the fact table?SQL 查询优化:在事实表中两次使用相同指标的最佳方法是什么? 【发布时间】:2020-02-26 18:19:14 【问题描述】:我有一个包含业务部门和员工姓名的维度表,如下所示。
桌子:暗淡
business | emp_name
-----------|-----------
sales | A
sales | B
marketing | C
product | D
IT | E
还有一个包含员工之间交易的事实表,如下所示。表: fct
client_emp_name | provider_emp_name | value
-----------------|--------------------|--------
A | C | 10
C | D | 5
C | B | 10
我想编写一个查询来查找每个业务作为客户和提供商的值总和(包括没有交易的业务单位)期望结果
business | provider_total_value | client_total_value
-----------|-----------------------|---------------------
sales | 10 | 10
marketing | 15 | 0
product | 0 | 5
IT | 0 | 0
对于这种情况,构建 SQL 查询的最佳方式是什么?我有以下查询可以提供准确的结果,但我不确定它是否是解决此问题的最佳方法。
With provider as (
SELECT
d.business,
SUM(f.value) as provider_total_value
FROM fct as f
right join dimension as d on d.emp_name = f.provider_emp_name
Group by 1
),
client as (
SELECT
d.business,
SUM(f.value) as client_total_value
FROM fct as f
right join dimension as d on d.emp_name = f.client_emp_name
Group by 1
)
Select
p.business,
COALESCE(p.provider_total_value, 0) as provider_total_value,
COALESCE(c.client_total_value, 0) as client_total_value
From provider as p
Inner join client as c on c.business = p.business
谢谢!
【问题讨论】:
在第二个查询中你没有做任何操作。 只有一个带有 CTE 的查询。 【参考方案1】:您能否也为 trades 表提供架构?
我认为您编写的查询是有效的。为了进一步改进,我会为主键(业务)使用整数数据类型,而不是字符/字符串数据类型。
【讨论】:
感谢您的回复,有一个错字,我编辑了它。两个内部查询都转到 fct 表 嗨@yl3441,如果答案有用,请您点赞吗?以上是关于SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章