2017-05-30 42 views
0

我可以使用以下PSQL查询(最后)获取我表格中单行的dense_rank,但是,我希望能够显示此为:PSQL dense_rank中不同项目中的一个项目

dense_rank OUT OF total distinct ranks

例如,由于dense_rank允许“关系”,可以这么说,如果我有100行和所选行排名第14位(也有只有59不同等级),我想说:

Ranked 14th out of 59

有没有一种方法可以修改我的查询来实现这一目标,还是必须使用多个查询?

这里是我的查询:

SELECT ranked.* 
FROM 
    (SELECT id, 
      postable_id, 
      spread_count, 
      bury_count, 
      read_count, 
      (spread_count*3) + (bury_count*-2) + (read_count*-1) AS score, 
      dense_rank() OVER (
          ORDER BY (spread_count*3) + (bury_count*-2) + (read_count*-1) DESC) AS RANK 
    FROM posts) AS ranked 
WHERE id = ? 

回答

1

你可以试试这个。

SELECT t.* 
FROM (SELECT ranked.*, 
     RNK||' out of '||MAX(RNK) OVER() as rnk_pos 
     FROM 
     (SELECT id, 
      postable_id, 
      spread_count, 
      bury_count, 
      read_count, 
      (spread_count*3) + (bury_count*-2) + (read_count*-1) AS score, 
      dense_rank() OVER (
          ORDER BY (spread_count*3) + (bury_count*-2) + (read_count*-1) DESC) AS RNK 
     FROM posts) AS ranked 
    ) t 
WHERE id=? 
+0

这似乎工作@vkp,谢谢!如果你有时间,你能解释这个黑魔法吗?非常感激。 – lightyrs

+1

@lightyrs ..我添加的唯一附加功能是获得最高排名(即本例中为59)的MAX(RNK)OVER()。 'RNK'就是你已经计算好的。连接它们会得到你所需要的。 –

0

基本上,你想这样:

SELECT p.* 
FROM (SELECT p.* 
      (spread_count*3) + (bury_count*-2) + (read_count*-1) AS score, 
      dense_rank() OVER (ORDER BY (spread_count*3) + (bury_count*-2) + (read_count*-1) DESC) AS RANK, 
      count(distinct (spread_count*3) + (bury_count*-2) + (read_count*-1)) over() as outof 
     FROM posts p 
    ) p 
WHERE id = ?; 

唉,不行,因为Postgres的不支持COUNT(DISTINCT)作为窗口函数。您可以使用其他窗口功能实现它:\

SELECT p.* 
FROM (SELECT p.*, 
      dense_rank() over (order by score desc) AS RANK, 
      sum((seqnum = 1)::int) as outof 
     FROM (SELECT p.*, 
        (spread_count*3) + (bury_count*-2) + (read_count*-1) AS score, 
        row_number() over (partition by (spread_count*3) + (bury_count*-2) + (read_count*-1) AS score order by spread_scount) as seqnum 
      FROM posts p 
      ) p 
    ) p 
WHERE id = ?; 
相关问题