为我们创建排名

2024-07-05 14:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据库里有很多用户

User -- Points
user1   4
user2   6
user3   2
user4   3
user5   8
user6   9
user7   1
user8   5

我正在寻找最简单的方法和更少的错误,以创建一个特定的用户排名5。我选择的用户应该在中间,上面有2个,下面有2个。你知道吗

示例1:user8 我应该收到:

user5   8
user2   6
**user8 5**
user1   4
user4   3

示例2:user4我应该收到:

user8   5
user1   4
**user4 3**
user3   2
user7   1

我也有例外。如果用户是TOP1,我需要显示下一个4 示例:用户6

**user6 9**
user5   8
user2   6
user8   5
user1   4

(如果用户是最后一个,则会发生相同的情况,因此在这种情况下,我需要接下来的4个用户。你知道吗

有人知道一个简单的方法吗?你知道吗

编辑:我没有要求任何人为我做这件事。我在寻求暗示。 我不明白那些反对票。只是个问题。你知道吗


Tags: 方法用户数据库示例情况pointsuseruser1
2条回答

我在sql server上实现了这一点,但在postgresql上实现了同样的功能。我现在包括了这两种功能。你知道吗

  • 检查Rank()函数,了解如何处理关系或使用row_number()
  • 使用变量而不是'user3'

Postgres Demo
SQL Fiddle Demo

WITH playerPoint as (
    SELECT "points"
    FROM Table1
    WHERE "user" = 'user3'
)    
SELECT *
FROM (
        SELECT *
        FROM (
                SELECT T."user", 
                       T."points", 
                       CASE WHEN T."points" = P."points"
                            THEN '*****' 
                            ELSE ''
                       END as Selected,
                       RANK() OVER (ORDER BY T."points" DESC) ranking

                FROM       Table1 T
                CROSS JOIN playerPoint P
                WHERE T."points" <= P."points"
                UNION
                SELECT T."user", 
                       T."points",
                       CASE WHEN T."points" = P."points"
                            THEN '*****' 
                            ELSE ''
                       END as Selected,
                       RANK() OVER (ORDER BY T."points" ASC) ranking

                FROM       Table1 T
                CROSS JOIN playerPoint P
                WHERE T."points" >= P."points"

        ) R1
        ORDER BY ranking
        LIMIT 5
     ) R2
ORDER BY POINTS

输出

enter image description here

在用user8DESC加到最后ORDER BY之后

enter image description here

这里t5是您的表,u是包含用户的列,r是包含点的列。。。我尝试了用户值'u4'-尝试你的。。。你知道吗

select u,r from (
select *, case when l2 = 'u4' or r1 > 0 or r < max(ur) over () then 1 else 0 end r2 from (
select *, case when l1 = 'u4' or r0 > 0 then 2 else 0 end r1, lag(l1) over (order by r) l2 from (
select *
     , row_number() over (order by r)
    , lag(u) over (order by r) l1
    , case when u = 'u4' then r else 0 end ur
     , count(*) over () 
    , case when u = 'u4' then 3 else 0 end r0
from t5 
order by r desc 
) prim
order by r desc 
) sec
) ter
where r2 > 0
order by r desc 
limit 5

相关问题 更多 >