【问题标题】:SUM for a week's worth of data一周的数据总和
【发布时间】:2021-12-27 21:55:26
【问题描述】:

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

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 美元?这可能吗?


所以原始查询的示例结果是:

Col A (User ID PurchaseAmount
1 $600
1 $800
2 $700
3 $1100

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

【问题讨论】:

  • 能否提供一些示例数据和示例输出,有点难以理解需求。我认为您希望按周分组并以 1000 美元为单位显示的购买总和,但可能还有很长的路要走
  • @wobr 已编辑!抱歉,我遗漏了很多内容,试图对数据保密。我还是 SQL 的新手,如果我解释得不好,敬请见谅。

标签: sql google-bigquery bq


【解决方案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;

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

【讨论】:

  • 这太棒了!我认为这行得通。只是一个问题:如何在结果中显示 SUM?这只是向我显示个人购买金额
  • @clucko87 看看更新后的答案。
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多