元组在另一个 table 中的排名

Ranking of a tuple in another table

所以我有 2 个表,A 队和 B 队,有他们的分数。我想使用 SQL 或 vertica 来计算 B 队中 A 队每个成员的得分排名,如下所示

 Team A Table

user   score
-------------   
asa      100        
bre      200     
cqw      50      
duy      50      




Team B Table

user   score 
------------  
gfh      20       
ewr      80     
kil      70      
cvb      90  

输出:

Team A Table

user   score   rank in team B
------------------------------ 
asa      100     1   
bre      200     1
cqw      50      4
duy      50      4

简单的相关查询应该做:

select 
    a.*,
    (select count(*) + 1 from table_b b where b.score > a.score) rank_in_b
from table_a a;

你需要做的就是统计tableb中得分高于当前用户的人数,然后加1得到排名。

试试这个 - 这只适用于 Vertica。

INTERPOLATE PREVIOUS VALUE 是 Vertica 特有的外连接谓词,它在不相等的列上连接两个 table,使用外连接 [=17] 中的 'last known' 值=]使匹配成功。

WITH
-- input, don't use in query itself
table_a (the_user,score) AS (
          SELECT 'asa',100        
UNION ALL SELECT 'bre',200     
UNION ALL SELECT 'cqw',50      
UNION ALL SELECT 'duy',50      
)
,
table_b(the_user,score) AS (
          SELECT 'gfh',20       
UNION ALL SELECT 'ewr',80     
UNION ALL SELECT 'kil',70      
UNION ALL SELECT 'cvb',90
)
-- end of input - start WITH clause here
,
ranked_b AS (
SELECT
  RANK() OVER(ORDER BY score DESC) AS the_rank
, *
FROM table_b
)
SELECT
  a.the_user AS a_user
, a.score    AS a_score
, b.the_rank AS rank_in_team_b
FROM table_a  a
LEFT JOIN ranked_b b
  ON a.score INTERPOLATE PREVIOUS VALUE b.score
ORDER BY 1
;

a_user|a_score|rank_in_team_b
asa   |    100|             1
bre   |    200|             1
cqw   |     50|             4
duy   |     50|             4