Po wykonaniu poniższej instrukcji:
SELECT Category FROM MonitoringJob ORDER BY CreationDate DESC
Otrzymuję z bazy danych następujące wartości:
test3
test3
bildung
test4
test3
test2
test1
ale chcę usunąć duplikaty, na przykład:
bildung
test4
test3
test2
test1
Próbowałem użyć DISTINCT, ale nie działa z ORDER BY w jednej instrukcji. Proszę pomóż.
Ważny:
Wypróbowałem to z:
SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC
to nie działa.
Kolejność według CreationDate jest bardzo ważna.
Odpowiedzi:
Problem polega na tym, że kolumny używane w
ORDER BY
nie są określone wDISTINCT
. Aby to zrobić, musisz użyć funkcji agregującej do sortowania i użyćGROUP BY
do wykonaniaDISTINCT
pracy.Spróbuj czegoś takiego:
źródło
Rozszerzone kolumny kluczy sortowania
Przyczyną, dla której to, co chcesz zrobić, nie działa, jest logiczna kolejność operacji w SQL , która dla twojego pierwszego zapytania jest (uproszczona):
FROM MonitoringJob
SELECT Category, CreationDate
tj. dodaj tzw. rozszerzoną kolumnę klucza sortowaniaORDER BY CreationDate DESC
SELECT Category
tzn. ponownie usuń rozszerzoną kolumnę klucza sortowania z wyniku.Tak więc, dzięki funkcji rozszerzonej kolumny klucza sortowania w standardzie SQL , jest całkowicie możliwe uporządkowanie według czegoś, czego nie ma w
SELECT
klauzuli, ponieważ jest do niego tymczasowo dodawane za kulisami.Więc dlaczego to nie działa
DISTINCT
?Jeśli dodamy
DISTINCT
operację, zostanie ona dodana międzySELECT
aORDER BY
:FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
Ale teraz, dzięki rozszerzonej kolumnie klucza sortowania
CreationDate
, semantykaDISTINCT
operacji została zmieniona, więc wynik nie będzie już taki sam. Nie tego chcemy, więc zarówno standard SQL, jak i wszystkie rozsądne bazy danych zabraniają tego użycia.Obejścia
Można go emulować za pomocą standardowej składni w następujący sposób
Lub po prostu (w tym przypadku), jak pokazuje również Prutswonder
Więcej szczegółów na temat SQL DISTINCT i ORDER BY zamieściłem tutaj .
źródło
DISTINCT ON
działa i jestem pewien, że to nie pomaga tutaj. Wyrażenie w nawiasach jest używane do określenia odrębności (warunek grupowania). Jeśli istnieją różne kategorie z tym samym,CreationDate
w wyniku pojawi się tylko jedna z nich! Ponieważ zastanawiałem się, czy może się w jakiś sposób nie pomyliłem, załadowałem również przykładową bazę danych w Twoim poście na blogu, aby dokładnie sprawdzić:DISTINCT ON
zapytanie, które tam podałeś, dało w sumie 1000 wyników (z dużą ilością duplikatówlength
), podczas gdy zapytanie poniżej dało tylko 140 (unikatowych) wartości.DISTINCT
(nieON
) i jedno, które używaDISTINCT ON
. Proszę zauważyć, że ta ostatnia wyraźnie nie usuwa zduplikowanych długości, ale zduplikowane tytuły. Myślę, że moja odpowiedź tutaj jest całkowicie poprawna.DISTINCT ON
warunki usuwają duplikaty przy użyciu niewłaściwego warunku. W Twoim poście na bloguDISTINCT ON
zapytanie rzeczywiście usuwa zduplikowane tytuły , jednakDISTINCT
zapytanie nad nim i zapytanie pod nim (dla którego twierdzisz, że jest to „cukier składniowy”) usuwa zduplikowane długości , ponieważ przypuszczalnie jest to cały cel. To samo dotyczy tutaj: OP chce usunąć zduplikowane kategorie , a nie zduplikowane CreationDates, jakDISTINCT ON
robi to zapytanie. Jeśli nadal mi nie wierzysz, sprawdź sam.Jeśli wynik MAX (CreationDate) nie jest potrzebny - jak w przykładzie oryginalnego pytania - jedyną odpowiedzią jest drugie stwierdzenie odpowiedzi Prashanta Gupty:
Wyjaśnienie: nie możesz użyć klauzuli ORDER BY w funkcji wbudowanej, więc instrukcja w odpowiedzi Prutswonder nie jest użyteczna w tym przypadku, nie możesz umieścić wokół niej zewnętrznej selekcji i odrzucić części MAX (CreationDate).
źródło
Po prostu użyj tego kodu, jeśli chcesz wartości kolumn [Category] i [CreationDate]
Lub użyj tego kodu, jeśli chcesz tylko wartości z kolumny [Kategoria].
Będziesz mieć wszystkie wyraźne rekordy, co tylko zechcesz.
źródło
Event
, możesz pisać[Event]
zamiastEvent
zatrzymywać SQL wyrzucający błąd analizy.Oryginalne wyniki wskazywały, że „test3” miał wiele wyników ...
Bardzo łatwo jest zacząć używać MAX przez cały czas, aby usunąć duplikaty w funkcji Group By ... i zapomnieć lub zignorować podstawowe pytanie ...
OP prawdopodobnie zdał sobie sprawę, że użycie MAX daje mu ostatnie „stworzone”, a użycie MIN da pierwsze „stworzone” ...
źródło
MAX
, niż czymś, co jest samodzielną odpowiedzią na pytanie.źródło
W podzapytaniu powinno działać:
źródło
Distinct posortuje rekordy w porządku rosnącym. Jeśli chcesz posortować w kolejności malejącej użyj:
Jeśli chcesz sortować rekordy na podstawie pola CreationDate, to pole to musi znajdować się w instrukcji select:
źródło
Możesz użyć CTE:
źródło
Spróbuj dalej, ale nie jest to przydatne w przypadku dużych danych ...
źródło
ORDER BY
w zapytaniach podrzędnych jest absolutnie poprawne. Ktoś nawet pozytywnie zagłosował na Twój nieprawidłowy komentarz.Można to zrobić za pomocą wewnętrznego zapytania w ten sposób
źródło
źródło