ฉันจะรับ MIN () ของสองฟิลด์ใน Postgres ได้อย่างไร


140

สมมติว่าฉันมีโต๊ะแบบนี้:

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

ฉันต้องการเลือกขั้นต่ำของ score_a และ score_b กล่าวอีกนัยหนึ่งดังนี้:

SELECT name, MIN(score_a, score_b)
FROM table

แน่นอนผลลัพธ์จะเป็น:

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

อย่างไรก็ตามเมื่อฉันลองทำสิ่งนี้ใน Postgres ฉันจะได้รับ "ไม่มีฟังก์ชั่นที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนดคุณอาจต้องเพิ่ม casts ประเภทชัดเจน" MAX () และ MIN () ดูเหมือนจะทำงานข้ามแถวมากกว่าคอลัมน์

เป็นไปได้ไหมที่จะทำสิ่งที่ฉันพยายาม?

คำตอบ:


246

LEAST (a, b):

GREATESTและLEASTฟังก์ชั่นเลือกที่ใหญ่ที่สุดหรือมีขนาดเล็กที่สุดค่าจากรายการจำนวนของการแสดงออกใด ๆ นิพจน์ต้องแปลงให้เป็นประเภทข้อมูลทั่วไปซึ่งจะเป็นประเภทของผลลัพธ์ (ดูรายละเอียดที่หัวข้อ 10.5สำหรับรายละเอียด) ค่า NULL ในรายการจะถูกละเว้น ผลลัพธ์จะเป็นค่า NULL เฉพาะเมื่อนิพจน์ทั้งหมดประเมินเป็น NULL

โปรดทราบว่าGREATESTและLEASTไม่ได้อยู่ในมาตรฐาน SQL แต่เป็นส่วนขยายทั่วไป ฐานข้อมูลอื่น ๆ ทำให้ NULL คืนถ้าอาร์กิวเมนต์ใด ๆ เป็น NULL แทนที่จะเฉพาะเมื่อ NULL ...


20
สำหรับคนอย่างผมที่ยังจะต้องมีMAX()สองค่าก็GREATEST(a, b):)
เวกเตอร์


-16

คุณสามารถรับคำตอบได้โดยใส่ข้อมูลลงในคอลัมน์ดังนี้

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

ที่นี่เราจะใส่ค่าต่ำสุดในหมู่ score_aและและการพิมพ์เดียวกันโดยการจัดเก็บค่าที่ในคอลัมน์ชื่อscore_bminimum_score


เพียง แต่min(expression)จะมีอยู่ คำจำกัดความจาก doc: ค่าต่ำสุดของการแสดงออกในทุกค่าที่มี `expression 'เป็นตัวเลข, สตริง, วันที่ / เวลา, เครือข่ายหรือประเภท enum หรืออาร์เรย์ประเภทเหล่านี้
charlesdg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.