我有一个如下所示的查询:
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。
感谢您的帮助。如果有任何不清楚的地方,请在评论中告诉我。
答案 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和完整表中的支出,它应该为您提供所需的输出。