PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:mendapatkan peringkat ordinal (indeks baris? ) secara efisien

@OMG_Ponies sudah menunjukkannya:fungsi jendela dense_rank() adalah yang Anda butuhkan - atau mungkin rank() . UPDATE bisa terlihat seperti ini:

Kasus uji:

CREATE TEMP TABLE tbl (
   id int
 , dollars int
 , dollars_rank int
 , points int
 , points_rank int
 );
INSERT INTO tbl VALUES
 (1, 20, 1, 35, 1)
,(2, 18, 2, 30, 3)
,(3, 10, 3, 33, 2)
,(4, 10, 3, 33, 2);  -- I put a dupe row in to demonstrate ties.

UPDATE pernyataan:

UPDATE tbl
SET    dollars_rank = r.d_rnk
     , points_rank  = r.p_rnk
FROM (
    SELECT id
         , dense_rank() OVER (ORDER BY dollars DESC) AS d_rnk
         , dense_rank() OVER (ORDER BY points DESC)  AS p_rnk
    FROM   tbl
    ) r
WHERE tbl.id = r.id

Anda memerlukan PostgreSQL 8.4 atau yang lebih baru untuk fungsi jendela.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HAPUS PostgreSQL rekursif

  2. Kolom dinamis dalam pernyataan SELECT postgres

  3. Buat peran PostgreSQL 9 dengan login (pengguna) hanya untuk menjalankan fungsi

  4. Hapus beberapa array secara paralel

  5. Kapan / bagaimana fungsi ekspresi nilai default terikat dengan search_path?