0

目前,我在工作中有一个这样的查询:

SELECT  ColumnA, ColumnB, PurchaseAmount/100 FROM TableX 
JOIN TableY ON TableX.A = TableY.B
WHERE PurchaseAmount/100 > 299
and PurchaseTimestamp >= DATE_ADD(CURRENT_TIMESTAMP(),INTERVAL -1 DAY)

所以这个查询每天运行一次。非常简单,效果很好。我的问题是,我怎么能说,SUM the PurchaseAmount(所以分离购买)到 1000 美元一周?这甚至可能吗?


因此,原始查询的示例结果将是:

列 A(用户 ID 采购量
1 600 美元
1 800 美元
2 700 美元
3 1100 美元

我希望返回:1 和 3,因为这些是总和超过 1000 美元的“ID”。(当然,更复杂的是,这些购买是在一周内发生的;不是一天。)

4

1 回答 1

1
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;

这确实假设最终结果是用于计算每周阈值的较大结果的子集。在您的情况下,这似乎是正确的。

于 2021-11-16T21:05:29.960 回答