sql错误“解析函数不能是另一个解析函数的参数”是什么意思?

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

我编写了以下 SQL 查询来查找最大数量严格大于每个订单(包括其本身)的平均数量的订单。一个订单包含购买的多种产品,因此每个产品都有对应的数量。请参阅附图中的表格

Table:order_details

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()
中,以获得所有平均数量中的最大值。但没有成功。

sql google-bigquery subquery aggregate-functions window-functions
1个回答
0
投票

从操作顺序的角度来看,有几个操作互相矛盾。

Bigquery sql 中有三种方法来过滤结果集:

  1. WHERE
    子句:此步骤在查询执行的早期执行,通常作为从磁盘选择数据时的第一步。这无法过滤通过
    GROUP BY
    或窗口函数聚合产生的数据。
  2. HAVING
    子句:此步骤在
    GROUP BY
    聚合之后执行,可用于根据
    GROUP BY
    聚合的结果过滤结果集。
  3. 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
© www.soinside.com 2019 - 2024. All rights reserved.