JOIN包含辅助表中的字段覆盖WHERE

时间:2015-12-11 22:38:58

标签: sql google-bigquery

我有一个如下所示的查询:

SELECT  d.account_id,
            d.product,
            d.month,
            sum(d.spend),
            u.lifetime_product_spend
    FROM FLATTEN(data_source, product) d
    LEFT JOIN (SELECT  account_id,
               product,
               SUM(product_spend)/1000000 lifetime_product_spend
               FROM usage
               GROUP BY account_id, product) u
    ON (d.account_id = u.account_id AND d.product = u.product)
    WHERE d.month >= DATE_ADD(today ,-5,"MONTH")
    GROUP BY d.account_id, d.product, d.month, u.lifetime_product_spend

由于数据量庞大,我只能包含过去6个月的数据。这就是为什么我要计算不同表中的生命周期花费并加入它们的原因。输出如下:

table: monthly                        
account_id         product           month         spend      lifetime_product_spend       
=====================================================================================
    A              product1           1             10                   50
    A              product1           2             20                   50
    A              product1           3             30                   50
    A              product2           1             5                    20
    A              product2           2             15                   20
    B              product2           2             100                  100
    B              product3           2             100                  150
    B              product3           3             50                   150
    C              product3           1             100                  500
    C              product3           2             400                  500

问题是,对于在6个月之前消费的产品,由于WHERE DATE_ADD过滤器,这些产品系列产品不会包含在内。我尝试了一个RIGHT JOIN到子查询,但我认为WHERE参数会覆盖它。我希望包含显示在子查询中的产品系列项,即使它们出现在6个月窗口之前。对于月份和支出列,它们都是NULL,但我仍然拥有lifetime_product_spend和account_id。

感谢您的帮助。如果有任何不清楚的地方,请在评论中告诉我。

2 个答案:

答案 0 :(得分:1)

如下所示 我删除了WHERE子句并修改了d.month和sum(d.spend)的行 Haven没有经过测试,但应该接近工作版

SELECT  
  d.account_id,
  d.product,
  CASE WHEN d.month >= DATE_ADD(CURRENT_DATE() ,-5,"MONTH") 
       THEN d.month ELSE NULL 
  END AS d_month,
  SUM(CASE WHEN d.month >= DATE_ADD(CURRENT_DATE() ,-5,"MONTH") 
           THEN d.spend ELSE 0 
      END) AS d_spend,
  u.lifetime_product_spend
FROM FLATTEN(data_source, product) d
LEFT JOIN (
  SELECT  
    account_id,
    product,
    SUM(product_spend)/1000000 lifetime_product_spend
  FROM usage
  GROUP BY account_id, product
) u 
ON (d.account_id = u.account_id AND d.product = u.product)
GROUP BY 1, 2, 3, 5 

答案 1 :(得分:0)

我还不完全清楚所期望的结果是什么,但我相信你想获得过去6个月的参赛作品加上SUM函数的总支出。

您的WHERE子句将您的查询限制为6个月,但我想您知道这一点。问题是它限制了查询的范围而不是过滤结果,因此您将无法以这种方式获得带有WHERE子句的SUM。换句话说,你的WHERE将取代你的SUM。

您可以使用单独的查询加入您拥有的内容(减去支出计算),以获取帐户ID和完整表中的支出,它应该为您提供所需的输出。