我在这个网站上训练自己对 query 的理解:
https://sqlzoo.net/wiki/SELECT_basics
我想知道,如何显示在“Asia”里,“population” 排名 3-5 名的国家?
https://sqlzoo.net/wiki/SELECT_basics
我想知道,如何显示在“Asia”里,“population” 排名 3-5 名的国家?
|
MarsBarJun 9, 2020
1
window function 了解一下
row_number() / rank() over (partition by continent order by population asc/desc) |
|
MarsBarJun 9, 2020
2
然后就可以在外面再套一层选择 where row_number/rank >=3 and <=5
具体是用 row_number, rank or dense_rank 看你的需求了 |
|
MarsBarJun 9, 2020
3
哦 外层条件别忘了 continent = 'Asia'
|
|
netnrJun 9, 2020
4
SELECT
* FROM ( SELECT name, row_number() OVER (ORDER BY population DESC) AS nid FROM world WHERE continent = 'Asia') T WHERE nid BETWEEN 3 AND 5 |
|
aijamJun 9, 2020
5
select * from world where continent = "Asia" order by population desc limit 3 offset 2;
|
|
carryerJun 9, 2020
6
SELECT * FROM world WHERE continent = 'Asia' ORDER BY population LIMIT 2,3;
|
|
xuanbgJun 9, 2020
8
5 楼,6 楼正解
|
|
9
|
|
cryboy007Jun 9, 2020
10
可以先排序,然后 limit offer
|
|
AmberJiangJun 9, 2020
11
窗口函数了解一下 谢谢
|
|
M7w2kh5a58AhKlcTJun 9, 2020
12
不知道这个玩意支持的 SQL 标准,MySQL/PG 通常用 limit,offset,ORACLE 用 rownum, 窗口函数 ORACLE,PG 支持
|
|
14
@netnr “row_number() OVER (ORDER BY population DESC) AS nid” 这里的逻辑是不是把每个 row 都标记成一个 nid,然后你最后用 nid 进行排序?
|
|
netnrJun 10, 2020
15
是的,按照指定排序并标记序号,然后按标记序号取
|
|
carryerJun 10, 2020
16
@sarices 对,LIMIT 无法处理并列排名。
@oooolongtea 在 https://sqlzoo.net/wiki/SELECT_basics 试用没出现错误提示,MySQL 类的才支持 LIMIT 。 |