SQL: 将 rank() 与聚合函数一起使用
SQL: use rank() together with aggregation function
假设我有一个数据 table data_table
包含一个标识符 ID
和两个值,val1
和 val2
:
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
------------------------
我想将val1
和val2
相乘并计算两个最小乘积值的平均值:
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;
假设我有一个数据 table data_table
包含一个标识符 ID
和两个值,val1
和 val2
:
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
------------------------
我想将val1
和val2
相乘并计算两个最小乘积值的平均值:
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;