首页 > 解决方案 > SQL 查询优化:在事实表中两次使用相同指标的最佳方法是什么?

问题描述

我有一个维度表,其中包含业务部门和员工姓名,如下所示。

:昏暗

  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

谢谢!

标签: sqlpostgresqlquery-optimizationamazon-redshift

解决方案


您也可以为交易表提供架构吗?

我认为您编写的查询是有效的。为了进一步改进,我将对主键(业务)使用整数数据类型,而不是字符/字符串数据类型。


推荐阅读