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

2021-09-05 15:39:13 +08:00
 zxCoder
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 一遍?

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

看你描述的需求我有点模糊,是不是用描述中的 SQL 排序完取其中特定某个 user 的数据?
可以用一个子查询,如果查询次数多慢的话,可以事先将聚合好的数据写进一张聚合表
tanhui2333
2021-09-05 19:49:38 +08:00
1. 获取 userId = xxx 的 min(time) min_time
2. 获取 比 min_time 小的有多少人
按这个思路看看
adoal
2021-09-05 20:20:34 +08:00
套一层 CTE
Rwing
2021-09-05 20:37:49 +08:00
接住第三方会更方便
vZexc0m
2021-09-06 09:09:55 +08:00
直接用 Redis 的 ZSet 实现排名。
AndyMadaou
2022-01-21 19:40:59 +08:00
@noparking188 窗口函数,rank () over ( partition by userid ordr by datetime ),具体自己搜一下
noparking188
2022-01-21 21:25:11 +08:00
@AndyMadaou #8 感谢解答,已经解决了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799971

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX