SQL: 将 rank() 与聚合函数一起使用

SQL: use rank() together with aggregation function

假设我有一个数据 table data_table 包含一个标识符 ID 和两个值,val1val2:

ID       val1      val2 
------------------------
1          3         4
2          2         5
3          8         9
4          1        -1
5          4        -2
6          5         3
7          6         6 
8          4         1 
9          2         9
10         4         1
------------------------

我想将val1val2相乘并计算两个最小乘积值的平均值:

avg(val1*val2 | rank(val1*val2) <= 2) (因此它是 100% 正确的,我们假设每个乘法都给出一个唯一的值)

我试过这个:

Select avg(multipl)
FROM
(Select val1 * val2 as multipl 
from data_table
where RANK() OVER (ORDER BY multipl  ASC) <= 2 )

不幸的是,Oracle-SQL 给我错误信息:window functions are not allowed here.

我不知道这条错误消息是什么意思,所以我也不知道代码是否可以正常运行(并且高效)。有谁知道如何处理此错误消息或如何有效地编写代码?我将不胜感激任何帮助。非常感谢。

您的方向是正确的,但是 window 函数需要从子查询返回以进行过滤。如果你想正好乘以两个,我会推荐 row_number()

Select avg(multipl)
from (Select val1 * val2 as multipl,
             row_number() over (order by val1 * val2 asc) as seqnum
      from data_table
     ) t
where seqnum <= 2;

你当然可以使用rank(),但那样的话平均值可能会超过两行。

如果 row_number() 是你想要的,我认为这可能更自然地通过限制子查询内的行来表达:

Select avg(multipl)
from (Select val1 * val2 as multipl
      from data_table
      order by multipl asc
      fetch first 2 rows only
     ) t;