PostgreSQL: Mendapatkan tanggal yang dikaitkan dengan nilai maksimal

Saya punya meja dalam bentuk

USER  |VALUE |DATE
-------------------------
user1 | 1337 | 2019-11-01
user1 | 1338 | 2019-03-28
user2 | 1234 | 2019-04-23
user2 | 4567 | 2019-05-05

dan ingin mendapatkan nilai maksimal dari setiap pengguna dengan tanggal terkait. Ketika saya melakukan sesuatu seperti

SELECT max(VALUE) FROM table
GROUP BY USER

Saya memiliki masalah karena saya tidak dapat menggabungkan atau mengelompokkan berdasarkan DATE. Bagaimana saya bisa memberi tahu PostgreSQL bahwa saya hanya ingin tanggal dikaitkan dengan baris di mana maks. nilainya adalah?

Terima kasih!


person gizarmaluke    schedule 10.12.2019    source sumber
comment
stackoverflow.com/questions/tagged/   -  person a_horse_with_no_name    schedule 10.12.2019


Jawaban (2)


Klik: demo:db‹>biola

Anda dapat menggunakan DISTINCT ON: Ini memberi Anda catatan pertama dari grup terurut. Dalam kasus Anda, grup adalah kolom user Anda. Ini Anda harus memesan paling lambat value DESC untuk mendapatkan maksimal value untuk menjadi rekor pertama. Ini akan diambil - termasuk nilai date yang terkait.

SELECT DISTINCT ON (user)
    *
FROM 
    mytable
ORDER BY user, value DESC
person S-Man    schedule 10.12.2019

Jika Anda ingin agregasi lain dalam kueri, Anda juga bisa menggunakan array_agg() untuk meniru fungsi "pertama":

select user, max(value), count(*),
       (array_agg(date order by value desc))[1] as date_at_max
from t
group by user;
person Gordon Linoff    schedule 10.12.2019
comment
Terima kasih! Saya memilih DISTINCT ON - person gizarmaluke; 10.12.2019
comment
@gizarmaluke . . . distinct on adalah solusi terbaik untuk pertanyaan khusus yang Anda ajukan. Saya menawarkan ini sebagai alternatif jika Anda telah menyederhanakan pertanyaannya. - person Gordon Linoff; 10.12.2019