Jak zwrócić 1 wartość na wiersz z maksymalnie kilku kolumn:
Nazwa tabeli
[Number, Date1, Date2, Date3, Cost]
Muszę zwrócić coś takiego:
[Number, Most_Recent_Date, Cost]
Pytanie?
sql
sql-server
tsql
Ben B
źródło
źródło
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Oto kolejne fajne rozwiązanie dla
Max
funkcjonalności wykorzystującej T-SQL i SQL Serverźródło
Jeśli używasz MySQL, możesz użyć
źródło
Istnieją jeszcze 3 metody, w których
UNPIVOT
(1) jest zdecydowanie najszybszy, a następnie Symulowane odwracanie (3), które jest znacznie wolniejsze niż (1), ale wciąż szybsze niż (2)Rozwiązanie 1 (
UNPIVOT
)Rozwiązanie 2 (zapytanie podrzędne na wiersz)
Rozwiązanie 3 (symulowane
UNPIVOT
)źródło
Każda z dwóch poniższych próbek będzie działać:
Drugi to dodatek do odpowiedzi lassevka .
źródło
Dla T-SQL (MSSQL 2008+)
źródło
źródło
Funkcja skalarna powoduje różnego rodzaju problemy z wydajnością, więc lepiej jest zawijać logikę w funkcję wycenioną w tabeli wbudowanej, jeśli to możliwe. Jest to funkcja, której użyłem do zastąpienia niektórych funkcji zdefiniowanych przez użytkownika, które wybrały daty Min / Max z listy maksymalnie dziesięciu dat. Podczas testowania na moim zestawie danych z 1 milionem wierszy funkcja skalarna zajęła ponad 15 minut, zanim zabiłem zapytanie, Inline TVF zajęło 1 minutę, co jest tym samym czasem, co wybranie zestawu wyników do tabeli tymczasowej. Aby użyć tego wywołania, należy użyć funkcji z podzapytania w SELECT lub CROSS APPLY.
źródło
Jest to nieco łatwiejsze do napisania i pomija etapy oceny, ponieważ instrukcja przypadku jest oceniana w kolejności.
źródło
Niestety odpowiedź Lasse , choć z pozoru oczywista, ma poważną wadę. Nie obsługuje wartości NULL. Każda pojedyncza wartość NULL powoduje zwrócenie daty 1. Niestety każda próba rozwiązania tego problemu staje się bardzo nieuporządkowana i nie skaluje się do 4 lub więcej wartości bardzo ładnie.
Pierwsza odpowiedź na databyss wyglądała (i jest) dobra. Nie było jednak jasne, czy odpowiedź łatwo ekstrapoluje do 3 wartości z łączenia wielu tabel zamiast prostszych 3 wartości z jednej tabeli. Chciałem uniknąć przekształcenia takiego zapytania w podwykonanie, aby uzyskać maksymalnie 3 kolumny, byłem też pewien, że doskonały pomysł bazy danych można trochę wyczyścić.
Więc bez zbędnych ceregieli, oto moje rozwiązanie (zaczerpnięte z pomysłu bazy danych).
Używa sprzężeń krzyżowych, wybierając stałe, aby symulować efekt łączenia wielu tabel. Ważną rzeczą do zapamiętania jest to, że wszystkie niezbędne aliasy przenoszą się poprawnie (co nie zawsze ma miejsce), a to sprawia, że wzór jest dość prosty i dość skalowalny poprzez dodatkowe kolumny.
źródło
Problem: wybierz minimalną wartość stawki podaną podmiotowi Wymagania: Stawki agencji mogą być zerowe
Zainspirowany tą odpowiedź od Nat
źródło
Jeśli używasz programu SQL Server 2005, możesz użyć funkcji UNPIVOT. Oto kompletny przykład:
źródło
Korzystanie z aplikacji CROSS APPLY (dla 2005+) ....
źródło
Z SQL Server 2012 możemy korzystać z IIF .
źródło
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Spróbuj użyć
UNPIVOT
:źródło
Wolę rozwiązania oparte na przypadku, moim założeniem jest, że powinno to mieć najmniejszy wpływ na możliwy spadek wydajności w porównaniu z innymi możliwymi rozwiązaniami, takimi jak te z zastosowaniem krzyżowym, wartościami (), funkcjami niestandardowymi itp.
Oto wersja przypadku, która obsługuje wartości zerowe z większością możliwych przypadków testowych:
a wynikiem jest:
źródło
Możesz utworzyć funkcję, w której podajesz daty, a następnie dodać funkcję do instrukcji select, jak poniżej. wybierz Numer, dbo.fxMost_Recent_Date (Date1, Date2, Date3), Koszt
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) ZWRACA smalldatetime NA POCZĄTEK DEKLARACJI @Result smalldatetime
KONIEC
źródło
W oparciu o rozwiązanie ScottPletcher z http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html Stworzyłem zestaw funkcji (np. GetMaxOfDates3, GetMaxOfDates13), aby znaleźć max maksymalnie 13 wartości daty przy użyciu UNION ALL. Zobacz funkcję T-SQL, aby uzyskać maksimum wartości z tego samego wiersza Jednak nie rozważałem rozwiązania UNPIVOT w momencie pisania tych funkcji
źródło
Kolejny sposób użycia CASE WHEN
źródło
Powyżej tabeli znajduje się tabela wynagrodzeń pracowników z kolumnami wynagrodzenie1, wynagrodzenie2, wynagrodzenie3, wynagrodzenie4. Poniższe zapytanie zwróci maksymalną wartość z czterech kolumn
Uruchomienie powyższej kwerendy spowoduje wyświetlenie wyniku jako największej wartości (10001)
Logika powyższego zapytania jest następująca:
wyjście wyniesie 10001
źródło
oto dobre rozwiązanie:
źródło
Nie wiem, czy jest to na SQL, itp. ... w pomocy M $ ACCESS istnieje wywołana funkcja,
MAXA(Value1;Value2;...)
która powinna to zrobić.Nadzieja może komuś pomóc.
PD: Wartościami mogą być kolumny lub wartości obliczone itp.
źródło
MAXA
jest funkcją Excela , a nie Access.