【问题标题】:Efficient Joins with the same big table同一张大表的高效连接
【发布时间】:2021-07-02 05:58:02
【问题描述】:

我想加入一个带有大结果集(+ 6M 行)的表。

我有下表

Period Zone TAG NAME PROGRAM COST
2020-10-01 EMEA A User2 Program 2 98
2020-11-01 APAC A User2 Program 2 103
2020-12-01 NA A User2 Program 2 118
2020-10-01 NA X User3 Program 3 334
2020-11-01 EMEA X User3 Program 3 362
2020-12-01 APAC X User3 Program 3 380

我想要一个具有这种输出的高效查询(我不介意没有值可以是 0 或 null):

Period Zone TAG NAME PROGRAM COST COST EMEA COST APAC COST NA
2020-10-01 EMEA A User2 Program 2 98 98 0 0
2020-11-01 APAC A User2 Program 2 103 0 103 0
2020-12-01 NA A User2 Program 2 118 0 0 118
2020-10-01 NA X User3 Program 3 334 0 0 334
2020-11-01 EMEA X User3 Program 3 362 362 0 0
2020-12-01 APAC X User3 Program 3 380 0 380 0

如果我执行以下查询需要很长时间:

WITH TOTAL AS (
SELECT Period,Zone,TAG,NAME,PROGRAM,COST
FROM "DB"."SCHEMA"."Table"
)
SELECT T.*,E."COST" AS "COST EMEA",A."COST" AS "COST APAC",N."COST" AS "COST NA"
FROM TOTAL T , TOTAL E, TOTAL A, TOTAL N
WHERE T."Period" = E."Period" 
AND T."Period" = A."Period"
AND T."Period" = N."Period" 

我该如何改进这个查询?有没有一种有效的方法来执行它?

【问题讨论】:

    标签: sql performance join snowflake-cloud-data-platform


    【解决方案1】:

    您的查询将需要很长时间才能运行,因为它正在对周期 ID 相同的行进行笛卡尔积 3 次(3 次连接)。我认为它也会产生错误的结果。

    如果我正确理解您的问题,我认为您正在寻找这样的东西:

    WITH TOTAL AS (
        SELECT
            Period,
            Zone,
            TAG,
            NAME,
            PROGRAM,
            COST
        FROM test_table
    )
    SELECT
        total.*,
        iff(upper(zone) = 'EMEA', cost, 0) as COST_EMEA,
        iff(upper(zone) = 'APAC', cost, 0) as COST_APAC,
        iff(upper(zone) = 'NA', cost, 0) as COST_NA
    from total
    ;
    
    

    这会生成下表(我认为您的示例结果不正确。表的最后一行将成本与NA 相关联,它应该是APAC。):

    PERIOD ZONE TAG NAME PROGRAM COST COST_EMEA COST_APAC COST_NA
    2020-10-01 EMEA A User2 Program 2 98 98 0 0
    2020-11-01 APAC A User2 Program 2 103 0 103 0
    2020-12-01 NA A User2 Program 2 118 0 0 118
    2020-10-01 NA X User3 Program 3 334 0 0 334
    2020-11-01 EMEA X User3 Program 3 362 362 0 0
    2020-12-01 APAC X User3 Program 3 380 0 380 0

    【讨论】:

    • 非常感谢您的宝贵时间,这个查询很棒:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 2016-11-27
    • 2023-02-23
    • 1970-01-01
    • 2017-07-27
    • 2015-02-26
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多