Jak uzyskać MIN () dwóch pól w Postgres?

140

Powiedzmy, że mam taki stół:

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

Chciałbym wybrać minimum score_a i score_b. Innymi słowy, coś takiego:

SELECT name, MIN(score_a, score_b)
FROM table

Wyniki byłyby oczywiście następujące:

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

Jednak gdy próbuję tego w Postgres, otrzymuję komunikat „Żadna funkcja nie pasuje do podanej nazwy i typów argumentów. Może być konieczne dodanie wyraźnych rzutów typu”. MAX () i MIN () wydają się działać w wierszach, a nie w kolumnach.

Czy można zrobić to, co próbuję?

mikrofon
źródło

Odpowiedzi:

246

NAJMNIEJ (a, b):

Funkcje GREATESTi LEASTwybierają największą lub najmniejszą wartość z listy dowolnej liczby wyrażeń. Wszystkie wyrażenia muszą być konwertowalne na wspólny typ danych, który będzie typem wyniku (szczegóły w sekcji 10.5 ). Wartości NULL na liście są ignorowane. Wynik będzie miał wartość NULL tylko wtedy, gdy wszystkie wyrażenia mają wartość NULL.

Zauważ, że GREATESTi LEASTnie są w standardzie SQL, ale są popularnym rozszerzeniem. Niektóre inne bazy danych powodują, że zwracają NULL, jeśli którykolwiek argument ma wartość NULL, a nie tylko wtedy, gdy wszystkie mają wartość NULL ...

cagcowboy
źródło
20
Dla takich jak ja, którym też będą potrzebne MAX()dwie wartości, to GREATEST(a, b):)
vektor
-16

Możesz uzyskać odpowiedź, umieszczając te dane w takiej kolumnie:

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

Tutaj umieszczamy minimalną wartość między score_ai score_bi drukujemy to samo, przechowując tę ​​wartość w kolumnie o nazwie minimum_score.

Mohamed Aamir
źródło
tylko min(expression)istnieje. Definicja z dokumentu: minimalna wartość wyrażenia dla wszystkich wartości wejściowych z „wyrażeniem” to dowolna liczba, ciąg znaków, data / godzina, typ sieci lub wyliczenia albo tablice tych typów
charlesdg