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

Bagaimana cara mendapatkan id dari baris yang dipilih oleh fungsi agregat?

Setidaknya ada 3 cara, lihat di bawah ini:

CREATE TEMP TABLE test (
    id integer, name text, amount numeric, datefrom timestamptz
);

COPY test FROM STDIN (FORMAT csv);
3,a,8,2018-01-01
4,a,3,2018-01-15 10:00
5,b,1,2018-02-20
6,b,1,2019-01-01
\.

Metode 1. menggunakan DISTINCT ON (khusus PostgreSQL)

SELECT DISTINCT ON (name)
  id, name, amount
FROM test
ORDER BY name, amount DESC, datefrom ASC;

Metode 2. menggunakan fungsi jendela

SELECT id, name, amount FROM (
  SELECT *, row_number() OVER (
    PARTITION BY name
    ORDER BY amount DESC, datefrom ASC) AS __rn
  FROM test) AS x
WHERE x.__rn = 1;

Metode 3. menggunakan subkueri terkait

SELECT id, name, amount FROM test
WHERE id = (
  SELECT id FROM test AS t2
  WHERE t2.name = test.name
  ORDER BY amount DESC, datefrom ASC
  LIMIT 1
); 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengurangi parameter postgresql.conf, sekaligus

  2. Rails:Izin Postgres ditolak untuk membuat database di rake db:create:all

  3. Kueri Postgres sangat lambat dengan current_date::date alih-alih tanggal hardcoded

  4. Nomor seri per grup baris untuk kunci majemuk

  5. Cara membagi transaksi read-only dan read-write dengan JPA dan Hibernate