Sql TERADATA:跨多个表聚合

Sql TERADATA:跨多个表聚合,sql,join,aggregate-functions,teradata,Sql,Join,Aggregate Functions,Teradata,考虑以下查询,其中聚合发生在两个表中:Sales和Promo,并且在计算中再次使用聚合值 SELECT sales.article_id, avg((sales.euro_value - ZEROIFNULL(promo.euro_value)) / NULLIFZERO(sales.qty - ZEROIFNULL(promo.qty))) FROM ( SELECT sales.article_id, sum(sales.euro_val

考虑以下查询,其中聚合发生在两个表中:Sales和Promo,并且在计算中再次使用聚合值

SELECT

  sales.article_id,
  avg((sales.euro_value - ZEROIFNULL(promo.euro_value)) / NULLIFZERO(sales.qty - ZEROIFNULL(promo.qty)))

FROM
(   SELECT 
         sales.article_id,
         sum(sales.euro_value),
         sum(sales.qty)
    from SALES_TABLE sales
    where year >= 2011
    group by article_id
) sales
LEFT OUTER JOIN
(   SELECT 
         promo.article_id,
         sum(promo.euro_value),
         sum(promo.qty)
    from PROMOTION_TABLE promo
    where year >= 2011
    group by article_id
) promo

ON sales.article_id = promo.article_id

GROUP BY sales.article_id;
有关查询的一些注释:

  • 这两个内部查询都返回大量的行,这是由于文章太多。在teradata上运行explain时,内部查询本身花费的时间非常少,但是连接需要很长时间
  • 假设项目id上的主键存在,并且两个表都按年份进行分区
  • 左外部联接,因为第二个表包含可选数据

  • 那么,你能推荐一种更好的方式来编写这个查询吗。感谢您阅读本文:)

    我不太确定avg函数是如何进入混音的,所以我将其删除

    SELECT article_id,
           (SUM(sales_value) - SUM(promo_value)) /
           (SUM(sales_qty) - SUM(promo_qty))
    FROM (
        SELECT 
             article_id,
             sum(euro_value) AS sales_value,
             sum(qty) AS sales_qty,
             0 AS promo_value,
             0 AS promo_qty
        from SALES_TABLE sales
        where year >= 2011
        group by article_id
        UNION ALL
        SELECT 
             article_id,
             0 AS sales_value,
             0 AS sales_qty,
             sum(euro_value) AS promo_value,
             sum(qty) AS promo_qty
        from SALES_TABLE sales
        where year >= 2011
        group by article_id
    ) AS comb
    
    GROUP BY article_id;
    

    促销表和销售表的主要索引是什么?听起来,假脱机重新分布或倾斜问题可能会影响您的查询。您也可以分享解释吗?您的两个内部查询都会生成唯一的
    article\u id
    值,因为相应的结果是按
    article\u id
    分组的。因此,您不需要在外部查询中按
    文章id
    分组。试着去掉外部分组,看看这是否能加快你的查询速度。是的,我同意。在此查询中,不需要外部分组依据。但就表现而言,这没有多大区别