我编写了以下 SQL 查询来查找最大数量严格大于每个订单(包括其本身)的平均数量的订单。一个订单包含购买的多种产品,因此每个产品都有对应的数量。请参阅附图中的表格
SQL代码:
SELECT DISTINCT
t.order_id
FROM
(SELECT
order_id,
MAX(quantity) OVER (PARTITION BY order_id) AS max_qty,
AVG(quantity) OVER (PARTITION BY order_id) AS avg_qty,
MAX(AVG(quantity) OVER (PARTITION BY order_id)) OVER() AS max_avg_qty
FROM
ordersdetails) AS t
WHERE
max_qty > max_avg_qty
ORDER BY
order_id
它抛出一个错误:
解析函数不能作为另一个解析函数的参数
这是什么意思?
我尝试使用窗口函数来得到答案。使用窗函数:
avg(quantity) over(partition by order_id) as avg_qty,
我计算了每个订单的平均购买数量,然后我把这个 在另一个窗口函数
max() over()
中,以获得所有平均数量中的最大值。但没有成功。
从操作顺序的角度来看,有几个操作互相矛盾。
Bigquery sql 中有三种方法来过滤结果集:
WHERE
子句:此步骤在查询执行的早期执行,通常作为从磁盘选择数据时的第一步。这无法过滤通过 GROUP BY
或窗口函数聚合产生的数据。HAVING
子句:此步骤在GROUP BY
聚合之后执行,可用于根据GROUP BY
聚合的结果过滤结果集。QUALIFY
子句:此步骤在针对结果集运行窗口函数后执行的最后执行。因为你想根据窗口函数的结果进行过滤,所以
QUALIFY
就是你想要的目标路线。
让事情变得更加复杂的是,您想要针对由另一个窗口函数确定的数据运行一个窗口函数。如果没有子查询,这根本不可能发生,因为每个选择仅运行一次该步骤。
考虑到您必须处理的操作顺序和步骤/处理中的限制,您的 SQL 将如下所示:
SELECT DISTINCT t.order_id
FROM
(SELECT
order_id,
MAX(quantity) OVER (PARTITION BY order_id) AS max_qty,
AVG(quantity) OVER (PARTITION BY order_id) AS avg_qty
FROM
ordersdetails) AS t
QUALIFY max_qty > MAX(avg_qty) OVER ()
ORDER BY order_id