1 MarsBar 2020-06-09 07:14:23 +08:00 window function 了解一下 row_number() / rank() over (partition by continent order by population asc/desc) |
2 MarsBar 2020-06-09 07:15:43 +08:00 然后就可以在外面再套一层选择 where row_number/rank >=3 and <=5 具体是用 row_number, rank or dense_rank 看你的需求了 |
3 MarsBar 2020-06-09 07:16:41 +08:00 哦 外层条件别忘了 cOntinent= 'Asia' |
![]() | 4 netnr 2020-06-09 07:42:14 +08:00 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 |
![]() | 5 aijam 2020-06-09 08:11:04 +08:00 select * from world where cOntinent= "Asia" order by population desc limit 3 offset 2; |
6 carryer 2020-06-09 08:19:24 +08:00 SELECT * FROM world WHERE cOntinent= 'Asia' ORDER BY population LIMIT 2,3; |
![]() | 8 xuanbg 2020-06-09 08:42:40 +08:00 5 楼,6 楼正解 |
9 oooolongtea OP |
10 cryboy007 2020-06-09 12:36:06 +08:00 可以先排序,然后 limit offer |
![]() | 11 AmberJiang 2020-06-09 15:27:04 +08:00 窗口函数了解一下 谢谢 |
12 M7w2kh5a58AhKlcT 2020-06-09 15:38:18 +08:00 不知道这个玩意支持的 SQL 标准,MySQL/PG 通常用 limit,offset,ORACLE 用 rownum, 窗口函数 ORACLE,PG 支持 |
14 oooolongtea OP @netnr “row_number() OVER (ORDER BY population DESC) AS nid” 这里的逻辑是不是把每个 row 都标记成一个 nid,然后你最后用 nid 进行排序? |
![]() | 15 netnr 2020-06-10 06:31:37 +08:00 是的,按照指定排序并标记序号,然后按标记序号取 |
16 carryer 2020-06-10 09:47:46 +08:00 @sarices 对,LIMIT 无法处理并列排名。 @oooolongtea 在 https://sqlzoo.net/wiki/SELECT_basics 试用没出现错误提示,MySQL 类的才支持 LIMIT 。 |