with data as (
SELECT ColumnA, ColumnB, PurchaseAmount / 100 as Amt,
sum(PurchaseAmount / 100) over (partition by ColumnA) as CustomerTotal
FROM TableX INNER JOIN TableY ON TableX.A = TableY.B
WHERE PurchaseAmount / 100 > 299
AND PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -7 DAY)
)
select ColumnA, ColumnB, Amt
from data where CustomerTotal > 1000;
我猜您希望将选择扩展到整整 7 天,而不仅仅是发布查询的一天,然后返回该范围内的所有客户购买。这是一种使用可用于过滤的每位客户的总计来扩充您的查询的方法。除以 100 的目的尚不清楚,但您应该能够根据您的数据轻松调整它。与 299 的比较类似。
您可能还希望仅使用子查询与通过单独查询匹配每周测试的客户列表进行比较。
SELECT ColumnA, ColumnB, PurchaseAmount / 100 as Amt,
FROM TableX INNER JOIN TableY ON TableX.A = TableY.B
WHERE PurchaseAmount / 100 > 299
AND PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY)
AND ColumnA IN (
SELECT ColumnA
FROM TableX INNER JOIN TableY ON TableX.A = TableY.B
WHERE PurchaseAmount / 100 > 299
AND PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -7 DAY)
GROUP BY ColumnA
HAVING SUM(PurchaseAmount / 100) > 1000
);
要获得结果的总数,您可以尝试:
with p as (
SELECT ColumnA, ColumnB, PurchaseAmount / 100 as Amt,
sum(PurchaseAmount / 100) over (partition by ColumnA) as CustomerTotal
FROM TableX INNER JOIN TableY ON TableX.A = TableY.B
WHERE PurchaseAmount / 100 > 299
AND PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -7 DAY)
)
select * from p
where PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY)
and CustomerTotal > 1000;
这确实假设最终结果是用于计算每周阈值的较大结果的子集。在您的情况下,这似乎是正确的。