自学 sql 中,遇到了一个问题,请教大家:如何在以下 query 里显示排名 3-5 的国家? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
oooolongtea
V2EX    MySQL

自学 sql 中,遇到了一个问题,请教大家:如何在以下 query 里显示排名 3-5 的国家?

  •  
  •   oooolongtea 2020-06-09 06:56:42 +08:00 4171 次点击
    这是一个创建于 1961 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在这个网站上训练自己对 query 的理解:
    https://sqlzoo.net/wiki/SELECT_basics

    我想知道,如何显示在“Asia”里,“population” 排名 3-5 名的国家?
    16 条回复    2020-06-10 09:47:46 +08:00
    MarsBar
        1
    MarsBar  
       2020-06-09 07:14:23 +08:00
    window function 了解一下

    row_number() / rank() over (partition by continent order by population asc/desc)
    MarsBar
        2
    MarsBar  
       2020-06-09 07:15:43 +08:00
    然后就可以在外面再套一层选择 where row_number/rank >=3 and <=5

    具体是用 row_number, rank or dense_rank 看你的需求了
    MarsBar
        3
    MarsBar  
       2020-06-09 07:16:41 +08:00
    哦 外层条件别忘了 cOntinent= 'Asia'
    netnr
        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
    aijam
        5
    aijam  
       2020-06-09 08:11:04 +08:00
    select * from world where cOntinent= "Asia" order by population desc limit 3 offset 2;
    carryer
        6
    carryer  
       2020-06-09 08:19:24 +08:00
    SELECT * FROM world WHERE cOntinent= 'Asia' ORDER BY population LIMIT 2,3;
    JieS
        7
    JieS  
       2020-06-09 08:23:44 +08:00 via iPhone
    @carryer 倒序排列后 limit 靠谱
    xuanbg
        8
    xuanbg  
       2020-06-09 08:42:40 +08:00
    5 楼,6 楼正解
    oooolongtea
        9
    oooolongtea  
    OP
       2020-06-09 12:27:26 +08:00
    @aijam @carryer 谢谢 我用了你们的 query,遇到了这个错误: “Incorrect syntax near 'LIMIT'.”

    @netnr 你的 query 可以跑,谢谢!
    cryboy007
        10
    cryboy007  
       2020-06-09 12:36:06 +08:00
    可以先排序,然后 limit offer
    AmberJiang
        11
    AmberJiang  
       2020-06-09 15:27:04 +08:00
    窗口函数了解一下 谢谢
    M7w2kh5a58AhKlcT
        12
    M7w2kh5a58AhKlcT  
       2020-06-09 15:38:18 +08:00
    不知道这个玩意支持的 SQL 标准,MySQL/PG 通常用 limit,offset,ORACLE 用 rownum, 窗口函数 ORACLE,PG 支持
    sarices
        13
    sarices  
       2020-06-09 15:43:25 +08:00
    @aijam
    @carryer
    并列排名的就不适合了
    oooolongtea
        14
    oooolongtea  
    OP
       2020-06-10 02:45:52 +08:00
    @netnr “row_number() OVER (ORDER BY population DESC) AS nid” 这里的逻辑是不是把每个 row 都标记成一个 nid,然后你最后用 nid 进行排序?
    netnr
        15
    netnr  
       2020-06-10 06:31:37 +08:00
    是的,按照指定排序并标记序号,然后按标记序号取
    carryer
        16
    carryer  
       2020-06-10 09:47:46 +08:00
    @sarices 对,LIMIT 无法处理并列排名。
    @oooolongteahttps://sqlzoo.net/wiki/SELECT_basics 试用没出现错误提示,MySQL 类的才支持 LIMIT 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5836 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:44 PVG 10:44 LAX 19:44 JFK 22:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86