查找包含用户详细信息的秩sql

amrnrhlw  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(277)

我正在努力学习sql技巧。我试图得到一个表中用户的排名,我使用下面在stackoverflow中找到的查询,效果非常好。

Select count(brp.*) + 1 From run_progress brp, (SELECT * FROM run_progress WHERE runner = 1 ) p WHERE brp.progress > p.progress;

它给了我正确的排名,但我也想得到详细的'p'p有详细的排名的人的详细资料。我该怎么做?希望我的问题清楚。需要选择“p”的所有列。
谢谢您
更新

CREATE TABLE run_progress
(
   id INT PRIMARY KEY,
   user varchar(255),
   progress numeric
)

INSERT INTO run_progress ( id, user, progress ) VALUES ( 9, 1, 100 )
INSERT INTO run_progress ( id, user, progress ) VALUES ( 11, 2, 90 )
INSERT INTO run_progress ( id, user, progress ) VALUES ( 14, 3, 60 )
INSERT INTO run_progress ( id, user, progress ) VALUES ( 10, 4, 10 )

这是我的table

for user:1 it should give me - 1, 9,1,100
for user:4 it should give me - 4, 10,4,100

希望这是清楚的。

jm81lzqq

jm81lzqq1#

你为什么不使用窗口函数?它们的性能更好,功能更强大:

select brp.*
from (SELECT brp.*, ROW_NUMBER() OVER (ORDER BY progress DESC) as seqnum
      FROM runprogress brp
     ) brp

我不是100%确定你想要什么,但是如果你想要排名的话 runner = 1 ,然后添加 where 条款:

select brp.*
from (SELECT brp.*, ROW_NUMBER() OVER (ORDER BY progress DESC) as seqnum
      FROM runprogress brp
     ) brp
where runner = 1;

注意:你的排名方法给了跑步者同样的分数 progress 不同的排名,这就是为什么使用 ROW_NUMBER() . 如果你想让领带有相同的分数,可以使用 RANK() 或者 DENSE_RANK() .
这是一把小提琴。

相关问题