Chcę napisać takie zapytanie:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Ale nie tak MAX
działa ta funkcja, prawda? Jest to funkcja agregująca, więc oczekuje pojedynczego parametru, a następnie zwraca MAX wszystkich wierszy.
Czy ktoś wie jak to zrobić po swojemu?
sql
sql-server
max
skb
źródło
źródło
GREATEST
funkcja; SQLite emuluje obsługę, dopuszczając wiele kolumn wMAX
agregacji.Odpowiedzi:
Musisz zrobić a,
User-Defined Function
jeśli chcesz mieć składnię podobną do twojego przykładu, ale czy możesz zrobić to, co chcesz, wstawiać, dość łatwo zCASE
instrukcją, jak powiedzieli inni.UDF
Może być coś takiego:... i nazwałbyś to tak ...
źródło
Jeśli używasz programu SQL Server 2008 (lub nowszego), jest to lepsze rozwiązanie:
Wszystkie kredyty i głosy powinny przejść do odpowiedzi Svena na powiązane pytanie „SQL MAX wielu kolumn?”
Mówię, że to „ najlepsza odpowiedź ”, ponieważ:
WYBIERZ MAKS (a), MAKS (b) OD (WARTOŚCI (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable (a, b)
źródło
Można to zrobić w jednym wierszu:
Edycja: Jeśli masz do czynienia z bardzo dużymi liczbami, musisz przekonwertować zmienne wartości na bigint, aby uniknąć przepełnienia liczb całkowitych.
źródło
Nie wydaje mi się Chciałem to kiedyś. Najbliżej było:
źródło
Dlaczego nie wypróbować funkcji IIF (wymaga programu SQL Server 2012 i nowszych)
Otóż to.
(Wskazówka: bądź ostrożny
null
, ponieważ jedno za>b
nich byłoby fałszywe , ponieważ wynik będzie fałszywy, gdy którykolwiek z nich będzie zerowy. Tak teżb
będzie w tym przypadku)źródło
NULL
, wynikiem będzie zawsze druga.NULL > 1234
instrukcja jest fałszywaIIF(a>b, a, COALESCE(b,a))
aby podać wartość, gdy istnieje tylko jedenźródło
Inne odpowiedzi są dobre, ale jeśli musisz się martwić o wartości NULL, możesz chcieć tego wariantu:
źródło
W SQL Server 2012 lub nowszym możesz użyć kombinacji
IIF
iISNULL
(lubCOALESCE
), aby uzyskać maksymalnie 2 wartości.Nawet jeśli 1 z nich ma wartość NULL.
Lub jeśli chcesz, aby zwracał 0, gdy oba mają wartość NULL
Przykładowy fragment:
Wynik:
Ale czy trzeba SUMOWAĆ wiele wartości?
Następnie sugeruję KRZYŻ ZASTOSOWAĆ do agregacji WARTOŚCI.
Ma to również tę zaletę, że może obliczyć inne rzeczy w tym samym czasie.
Przykład:
źródło
Zapytania podrzędne mogą uzyskiwać dostęp do kolumn z zapytania zewnętrznego, dzięki czemu można użyć tego podejścia do użycia agregatów, takich jak
MAX
między kolumnami. (Prawdopodobnie bardziej przydatne, gdy zaangażowana jest większa liczba kolumn)źródło
VALUES
składnia jest ładniejsza.SQL Server 2012 wprowadził
IIF
:Podczas używania zalecane jest używanie wartości NULL
IIF
, ponieważNULL
po obu stronachboolean_expression
będąIIF
zwracane wartościfalse_value
(w przeciwieństwie doNULL
).źródło
Wybrałbym rozwiązanie dostarczone przez kcrumley. Po prostu zmodyfikuj go nieco, aby obsługiwał wartości NULL
EDYCJA Zmodyfikowano po komentarzu Marka . Jak słusznie zauważył w 3 wartościowej logice x> NULL lub x <NULL zawsze powinien zwracać NULL. Innymi słowy nieznany wynik.
źródło
To takie proste:
źródło
źródło
Ups, właśnie opublikowałem duplikat tego pytania ...
Odpowiedź brzmi: nie ma wbudowanej funkcji takiej jak Greatest Oracle , ale podobny wynik można uzyskać dla 2 kolumn z UDF, zauważ, że użycie sql_variant jest tutaj bardzo ważne.
kristof
Wysłałem tę odpowiedź:
źródło
Oto przykład przypadku, który powinien obsługiwać wartości zerowe i działać ze starszymi wersjami MSSQL. Jest to oparte na funkcji inline w jednym z popularnych przykładów:
źródło
Prawdopodobnie nie zrobiłbym tego w ten sposób, ponieważ jest mniej wydajny niż wspomniane już konstrukcje CASE - chyba że być może masz indeksy obejmujące oba zapytania. Tak czy inaczej, jest to przydatna technika dla podobnych problemów:
źródło
W przypadku powyższej odpowiedzi dotyczącej dużych liczb można wykonać mnożenie przed dodawaniem / odejmowaniem. Jest trochę nieporęczny, ale nie wymaga obsady. (Nie umiem mówić o szybkości, ale zakładam, że wciąż jest dość szybki)
Zmiany w
przynajmniej alternatywa, jeśli chcesz uniknąć rzucania.
źródło
Oto wersja IIF z obsługą NULL (na podstawie odpowiedzi Xina):
Logika jest następująca: jeśli jedna z wartości jest równa NULL, zwróć tę, która nie jest równa NULL (jeśli obie są równe NULL, zwracana jest wartość NULL). W przeciwnym razie zwróć większą.
To samo można zrobić dla MIN.
źródło
Możesz zrobić coś takiego:
źródło
źródło
źródło
W najprostszej formie ...
źródło
W przypadku programu SQL Server 2012:
źródło
Oto odpowiedź @ Scott Langham z prostą obsługą NULL:
źródło
źródło
źródło
VALUES
inline, nie jestem pewien, czy jest to prostsze niżCASE
lubIFF
. Byłbym zainteresowany, aby zobaczyć, jak wydajność tego rozwiązania wypada w porównaniu z innymi opcjamiRozwijając odpowiedź Xin i zakładając, że typem wartości porównawczej jest INT, to podejście również działa:
To jest pełny test z przykładowymi wartościami:
źródło
W MemSQL wykonaj następujące czynności:
źródło
W Presto możesz użyć
źródło