【问题标题】:SQL ranking over two tables两个表的 SQL 排名
【发布时间】:2014-09-03 01:31:18
【问题描述】:

我有两个用户排名表。 表 rankingArankingB。 每个表都有列:

  • user_id
  • group_id

分数越高,用户/组的排名就越高...

现在我尝试获取我所在组的排名问题的组排名。 到目前为止,我有这个 SQL:

select sum(ra.points) as rapoints, sum(rb.points) as rbpoints from public.rankinga ra
LEFT JOIN public.rankingb rb ON ra.group_id=rb.group_id and ra.user_id=rb.user_id where
ra.group_id=200;

它返回第 200 组的rankinga 和rankinb 的分数。 我怎样才能得到小组的排名?我试过了: row_number() OVER (ORDER BY sum(rb.points) DESC) AS rankb 但得到了错误的结果。

我对 group_id 200 的预期结果是:

rapoints,rbpoints,rarank, rbrank
420,        10,     3,  same points as group_id 300 so rbrank 2 or 3

我怎样才能得到这个?

设置

CREATE TABLE rankinga
(
user_id bigint,
group_id bigint,
points integer
)
CREATE TABLE rankingb
(
user_id bigint,
group_id bigint,
points integer
)
insert into public.rankinga (user_id,group_id,points) values (1,100,120),(2,100,300),  (3,100,20),(4,200,300),(5,200,120),(6,300,600);
insert into public.rankingb (user_id,group_id,points) values (1,100,5),(2,100,3),(3,100,10),(4,200,2),(5,200,8),(6,300,10);

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我想你想用union all、聚合和窗口函数来做到这一点。加入表可能会丢失行(如果用户在一个表中但不在另一个表中)或计数过多(如果您加入组)。所以这可能会做你想做的事:

    select group_id, sum(rapoints) as rapoints, sum(rbpoints) as rbpoints,
           sum(rapoints) + sum(rbpoints) as points,
           dense_rank() over (order by sum(rapoints) + sum(rbpoints) desc) as ranking
    from ((select ra.group_id, sum(ra.points) as rapoints, 0 as rbpoints
           from public.rankinga ra
           group by ra.group_id
          ) union all
          (select rb.group_id, 0, sum(rb.points) as rbpoints
           from public.rankingb rb
           group by rb.group_id
          )
         ) ab
    group by group_id;
    

    如果您只想选择一个组,请将其放入子查询(或 CTE)中,然后选择该组。

    Here 是一个 SQL Fiddle。

    编辑:

    如果您只需要一组的结果,您仍然需要计算所有组的值。所以:

    select ab.*
    from (<above query here>) ab
    where group_id = 200;
    

    【讨论】:

    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多