我正在使用 BigQuery 中的一个表,该表有数百万行,我正在尝试降低这些数据的粒度。
我的最终目标是有一张看起来像这样的桌子。
周 | 型号 | 数量 | 价格 |
---|---|---|---|
10 | AA | 5 | 90 |
10 | BB | 2 | 40 |
11 | 抄送 | 4 | 50 |
DATE_TRUNC(t.DATE_REQUEST, WEEK(MONDAY)) AS PURCHASE_WEEK_MONDAY_START
因此在上面的示例表中,第 10 周在 AA 和 BB 中有两个不同的模型。 AA 的数量总和为 5(订单号 A23 和 B45 的最大值为 2 和 3),价格 90 是价格线的总和。订单号为 E78 的 BB 的最大数量为 2,价格总和为 40。
原表结构如下。不允许空值。
订购日期 | 订单号 | 类型 | 型号 | 数量 | 价格 |
---|---|---|---|---|---|
2023-03-10 | A23 | Z | AA | 2 | 10 |
2023-03-10 | A23 | X | AA | 2 | 20 |
2023-03-10 | A23 | Y | AA | 2 | 10 |
2023-03-11 | E78 | X | BB | 2 | 20 |
2023-03-11 | E78 | Z | BB | 2 | 20 |
2023-03-12 | B45 | Y | AA | 3 | 5 |
2023-03-12 | B45 | Z | AA | 3 | 15 |
2023-03-12 | B45 | X | AA | 3 | 20 |
2023-03-12 | B45 | 问 | AA | 3 | 10 |
2023-03-15 | C56 | X | 抄送 | 1 | 30 |
2023-03-15 | C56 | Y | 抄送 | 1 | 5 |
2023-03-17 | D89 | Z | 抄送 | 3 | 15 |
您可以使用两个级别的聚合来做到这一点。先取每周/订单/模型元组的最大数量,然后按周/订单求和。
select purchase_week, model,
sum(max_quantity) quantity,
sum(sum_price) price
from (
select
date_trunc(order_date, ISOWEEK) purchase_week,
order_number,
model,
max(quantity) max_quantity,
sum(price) sum_price
from mytable t
group by purchase_week, order_number, model
) t
group by purchase_week, model
order by purchase_week, model
注意:我用
ISOWEEK
截断日期; ISO 周从星期一开始。第一个 ISO 周包含一年中的第一个星期四,如文档中所述。