Bagaimana cara mendapatkan MIN () dari dua bidang di Postgres?


147

Katakanlah saya memiliki meja seperti ini:

name | score_a | score_b
-----+---------+--------
 Joe |   100   |   24
 Sam |    96   |  438
 Bob |    76   |  101
 ... |   ...   |  ...

Saya ingin memilih minimal score_a dan score_b. Dengan kata lain, sesuatu seperti:

SELECT name, MIN(score_a, score_b)
FROM table

Hasilnya, tentu saja:

name | min
-----+-----
 Joe |  24
 Sam |  96
 Bob |  76
 ... | ...

Namun, ketika saya mencoba ini di Postgres, saya mendapatkan, "Tidak ada fungsi yang cocok dengan nama yang diberikan dan tipe argumen. Anda mungkin perlu menambahkan tipe cast eksplisit." MAX () dan MIN () tampaknya bekerja di seluruh baris daripada kolom.

Apakah mungkin untuk melakukan apa yang saya coba?

Jawaban:


258

SEDIKITNYA (a, b):

Fungsi GREATESTdan LEASTmemilih nilai terbesar atau terkecil dari daftar sejumlah ekspresi. Semua ekspresi harus dapat diubah menjadi tipe data umum, yang akan menjadi tipe hasil (lihat Bagian 10.5 untuk detailnya). Nilai NULL dalam daftar diabaikan. Hasilnya akan menjadi NULL hanya jika semua ekspresi dievaluasi ke NULL.

Perhatikan bahwa GREATESTdan LEASTtidak dalam standar SQL, tetapi merupakan ekstensi umum. Beberapa database lain membuat mereka mengembalikan NULL jika ada argumen yang NULL, bukan hanya ketika semuanya NULL ...


23
Untuk orang-orang seperti saya yang juga membutuhkan MAX()dua nilai, itu GREATEST(a, b):)
vektor

@vektor: cara yang bagus untuk menambahkan kata pencarian tambahan sehingga jawaban ini dapat ditemukan melalui Google!
Mikko Rantalainen


-17

Anda bisa mendapatkan jawabannya dengan memasukkan data tersebut ke dalam kolom seperti ini:

SELECT name, MIN(score_a, score_b) as minimum_score
FROM table

Di sini, kami meletakkan nilai minimum di antara score_adan score_bdan mencetak yang sama dengan menyimpan nilai itu di kolom bernama minimum_score.


hanya min(expression)ada. Definisi dari doc: nilai minimum ekspresi di semua nilai input dengan` ekspresi` adalah sembarang jenis numerik, string, tanggal / waktu, jaringan, atau enum, atau array jenis ini
charlesdg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.