To wydaje się łatwe. Jak uzyskać najnowsze daty w różnych kolumnach
DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30', '2019-10-25')
INSERT #indebtedness VALUES ('Key2', '2019-10-20', '2019-10-30', '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4', null , '2019-10-29', '2019-10-13')
select call_case, ?? AS 'Latest Date' from #indebtedness
Chciałbym, aby wynik był:
call_case Latest Date
Key1 2019-11-30
Key2 2019-10-30
Key3 2019-11-11
Key4 2019-10-29
sql
sql-server
datetime
Ahmed Alkhteeb
źródło
źródło
NULL
.MAX
użyciuGROUP BY
. Więc moja odpowiedź na twoje pytanie brzmi: „nie naprawi się”, ponieważ myślę, że być może projekt bazy danych musi się zmienić.call_case
) i znacznikiem czasu. Ani jednego stołu z 50 kolumnamiObecnie akceptowane odpowiedź jest najlepszą odpowiedzią, ale nie sądzę, że ma wystarczająco dobrą robotę wyjaśniając dlaczego. Inne odpowiedzi na pierwszy rzut oka wyglądają o wiele czystiej (kto chce napisać to brzydkie stwierdzenie przypadku), ale prawdopodobnie będzie znacznie gorzej, gdy zaczniesz działać na dużą skalę.
Oto jak skonfigurowałem wszystko
W moim systemie otrzymałem 12,872 738 wierszy w tabeli. Jeśli wypróbuję każde z powyższych zapytań (poprawione, aby
SELECT INTO
nie trzeba było czekać na zakończenie drukowania wyników w SSMS), otrzymam następujące wyniki:Jeśli spojrzysz na plany zapytań, stanie się dość oczywiste, dlaczego - dodając dowolny rodzaj unpivot lub agregacji (lub niebiańskiego zabrania
STRING_SPLIT
) otrzymasz szereg różnych operatorów, których nie potrzebujesz (i to zmusza plan do równolegle, zabierając zasoby, których mogą chcieć inne zapytania). Zgodnie z umową,CASE
oparte na rozwiązaniu rozwiązanie nie idzie równolegle, działa bardzo szybko i jest niezwykle proste.W takim przypadku, chyba że masz nieograniczone zasoby (nie masz), powinieneś wybrać najprostsze i najszybsze podejście.
Pojawiło się pytanie, co należy zrobić, jeśli trzeba dodawać nowe kolumny i rozszerzać instrukcję case. Tak, robi się to niewygodne, ale każde inne rozwiązanie. Jeśli jest to w rzeczywistości możliwy przepływ pracy, powinieneś przeprojektować swoją tabelę. To, czego chcesz, prawdopodobnie wygląda mniej więcej tak:
Z pewnością nie jest to wolne od potencjalnych problemów z wydajnością i będzie wymagało starannego dostrajania indeksu, ale jest najlepszym sposobem na obsługę dowolnej liczby potencjalnych znaczników czasu
W przypadku usunięcia jakichkolwiek odpowiedzi, oto wersje, które porównywałem (w kolejności)
źródło
Spróbuj tego:
źródło
NULL
s, powinien mieć dobrą wydajność i łatwo generalizować do większej liczby kolumn.FIDDLE SQL
Posługiwać się
MAX()
Posługiwać się
CASE
źródło
VALUES
jest znacznie bardziej skalowalna niż dużeCASE
wyrażenie. Ja również chciałbym dowiedzieć się, dlaczego został on odrzucony, ponieważ głosujący wydaje się wierzyć, że istnieje problem z SQL, a zatem jeśli powiedzą nam o tym problemie, wszyscy możemy się z niego nauczyć.Moim zdaniem Pivot jest najlepszą i wydajną opcją dla tego zapytania. Skopiuj i wklej w MS SQL SERVER. Sprawdź kod napisany poniżej:
źródło
To naprawdę powinno zostać ponownie ocenione na poziomie projektu, jak wskazali inni. Poniżej znajduje się przykład innego projektu wykorzystującego dwie tabele, aby lepiej osiągnąć to, czego szukasz w wynikach. To sprawi, że wzrost będzie znacznie korzystniejszy.
Oto przykład (używane różne nazwy tabel):
Umożliwia to dodanie większej liczby typów spraw, dodanie większej liczby wpisów do dziennika i zapewnia lepszy projekt.
To tylko przykład do celów edukacyjnych.
źródło