V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  PostgreSQL

请教个查询排名 RANK 的 sql 写法

  •  1
     
  •   zxCoder · 2021-09-05 15:39:13 +08:00 · 2221 次点击
    这是一个创建于 1200 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SELECT userId, MIN(time), RANK() OVER (ORDER BY MIN(time) ASC) AS
     "rank" FROM game  WHERE a = 1 AND b = 2 AND c = 3 GROUP BY userId
    

    这个 sql 能查出按 user 分组之后每个 user 最小的 time 和 rank,但是如果我想只查询其中某个 user 的 rank,应该怎么写呢?还是全部读取再自己 for 一遍?

    9 条回复    2022-01-21 21:25:11 +08:00
    xupefei
        1
    xupefei  
       2021-09-05 16:08:31 +08:00 via iPhone   ❤️ 1
    外面加一个 where 不就行了
    noparking188
        2
    noparking188  
       2021-09-05 18:04:13 +08:00
    Mark,老哥有答案了艾特我一下
    noparking188
        3
    noparking188  
       2021-09-05 18:17:56 +08:00
    看错了,需求不一样
    借题描述下,我想按 userId 分组对每个分组排序 time 计算得出每组一个 rank 排行
    你题目中的 SQL 貌似是取每个 user 最小 time 的数据去排名

    看你描述的需求我有点模糊,是不是用描述中的 SQL 排序完取其中特定某个 user 的数据?
    可以用一个子查询,如果查询次数多慢的话,可以事先将聚合好的数据写进一张聚合表
    tanhui2333
        4
    tanhui2333  
       2021-09-05 19:49:38 +08:00   ❤️ 1
    1. 获取 userId = xxx 的 min(time) min_time
    2. 获取 比 min_time 小的有多少人
    按这个思路看看
    adoal
        5
    adoal  
       2021-09-05 20:20:34 +08:00
    套一层 CTE
    Rwing
        6
    Rwing  
       2021-09-05 20:37:49 +08:00
    接住第三方会更方便
    vZexc0m
        7
    vZexc0m  
       2021-09-06 09:09:55 +08:00   ❤️ 1
    直接用 Redis 的 ZSet 实现排名。
    AndyMadaou
        8
    AndyMadaou  
       2022-01-21 19:40:59 +08:00
    @noparking188 窗口函数,rank () over ( partition by userid ordr by datetime ),具体自己搜一下
    noparking188
        9
    noparking188  
       2022-01-21 21:25:11 +08:00
    @AndyMadaou #8 感谢解答,已经解决了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:42 · PVG 03:42 · LAX 11:42 · JFK 14:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.