Window 带有限制子句的函数
Window function with a limit clause
给定这个团队数据集
id | team_name | points
1 | A | 10
2 | B | 20
3 | C | 30
4 | D | 40
5 | E | 50
我可以将此查询与 window 函数结合使用来获取前 3 支球队的平均值
with top_3 as(
select *
from teams
order by points desc
limit 3
)
select *, avg(points) over() as top3_average
from top_3
是否可以仅对数据集的前 3 行使用 window 函数?
我试过了,但肯定不行。
OVER(... limit 3)
这是一个有效的 sqlfiddle
需要说明的是,我知道我可以用这样的子查询来做到这一点。我更有兴趣了解 window 函数
是否可行
select *, avg(points) over() as top3_average
from teams
where id in
(select id
from teams
order by points desc
limit 3)
可以使用 row_number()
window 函数
with top_3 as(
select * ,row_number() over(order by points desc) rn
from teams
) select * form top_3 where rn<=3
不,不是真的。您无法轻松指定仅包含前三行的 FRAME。您可以在第一行中获取平均值,然后在其他任何地方放置空值,但这似乎是一个糟糕的主意:
select *,
avg(points) OVER (ORDER BY points desc ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)
* CASE WHEN row_number() OVER (ORDER BY points desc) = 1 THEN 1 ELSE null END
FROM teams;
id | team_name | points | ?column?
----+-----------+--------+---------------------
6 | F | 60 | 50.0000000000000000
5 | E | 50 |
4 | D | 40 |
3 | C | 30 |
2 | B | 20 |
1 | A | 10 |
(6 rows)
给定这个团队数据集
id | team_name | points
1 | A | 10
2 | B | 20
3 | C | 30
4 | D | 40
5 | E | 50
我可以将此查询与 window 函数结合使用来获取前 3 支球队的平均值
with top_3 as(
select *
from teams
order by points desc
limit 3
)
select *, avg(points) over() as top3_average
from top_3
是否可以仅对数据集的前 3 行使用 window 函数?
我试过了,但肯定不行。
OVER(... limit 3)
这是一个有效的 sqlfiddle
需要说明的是,我知道我可以用这样的子查询来做到这一点。我更有兴趣了解 window 函数
是否可行select *, avg(points) over() as top3_average
from teams
where id in
(select id
from teams
order by points desc
limit 3)
可以使用 row_number()
window 函数
with top_3 as(
select * ,row_number() over(order by points desc) rn
from teams
) select * form top_3 where rn<=3
不,不是真的。您无法轻松指定仅包含前三行的 FRAME。您可以在第一行中获取平均值,然后在其他任何地方放置空值,但这似乎是一个糟糕的主意:
select *,
avg(points) OVER (ORDER BY points desc ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)
* CASE WHEN row_number() OVER (ORDER BY points desc) = 1 THEN 1 ELSE null END
FROM teams;
id | team_name | points | ?column?
----+-----------+--------+---------------------
6 | F | 60 | 50.0000000000000000
5 | E | 50 |
4 | D | 40 |
3 | C | 30 |
2 | B | 20 |
1 | A | 10 |
(6 rows)