2017-05-30 8 views
0

私のテーブルの1つの行のdense_rankを得るために、(最後に)次のPSQLクエリを使用することはできますが、このよう:PSQL dense_rankの1つのアイテムが別個の合計アイテムのうち

例えば

dense_rank OUT OF total distinct ranks

、私は100行を有し、選択された行が14ランク(のみ59の異なるランクがある)されている場合dense_rankは、いわば、「関係」を可能にするので、私は言うこと:

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

基本的に、あなたはこれをしたい:Postgresは窓関数としてCOUNT(DISTINCT)をサポートしていないため、動作しません

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 = ?; 

悲しいかな、。他のウィンドウ関数を使用して実装することができます:\

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 = ?; 
関連する問題