Sum values based on Unique values in other column

问题描述 投票:0回答:1

我正在使用 BigQuery 中的一个表,该表有数百万行,我正在尝试降低这些数据的粒度。

我的最终目标是有一张看起来像这样的桌子。

型号 数量 价格
10 AA 5 90
10 BB 2 40
11 抄送 4 50
  • Week:首先,我想通过按周汇总数据来减少基于 Order Date 的行数。我相信以下内容应该适用于此:
    DATE_TRUNC(t.DATE_REQUEST, WEEK(MONDAY)) AS PURCHASE_WEEK_MONDAY_START
  • 型号:型号不是唯一的,但每个订单号只能有一个型号
  • 数量:数量是一个棘手的数字,因为我想返回每个订单号的最大数量。因此,即使订单号 A23 有三行 2,我只希望它返回数字 2(而不是 6)。
  • 价格应该是所有行的总和。

因此在上面的示例表中,第 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
sql google-bigquery aggregate-functions date-arithmetic
1个回答
0
投票

您可以使用两个级别的聚合来做到这一点。先取每周/订单/模型元组的最大数量,然后按周/订单求和。

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 周包含一年中的第一个星期四,如文档中所述。

© www.soinside.com 2019 - 2024. All rights reserved.