Chcę zwrócić 10 najlepszych rekordów z każdej sekcji w jednym zapytaniu. Czy ktoś może pomóc w tym, jak to zrobić? Sekcja jest jedną z kolumn w tabeli.
Bazą danych jest SQL Server 2005. Chcę zwrócić 10 najlepszych według wprowadzonej daty. Sekcje są biznesowe, lokalne i funkcjonalne. Dla jednej konkretnej daty chcę tylko górne (10) wierszy biznesowych (najnowszy wpis), górne (10) wierszy lokalnych i górne (10) funkcji.
Odpowiedzi:
Jeśli używasz SQL 2005, możesz zrobić coś takiego ...
Jeśli twoje RankCriteria ma powiązania, możesz zwrócić więcej niż 10 rzędów, a rozwiązanie Matta może być dla Ciebie lepsze.
źródło
DENSE_RANK
tym, że nie ma żadnych luk w numeracji. +1W T-SQL zrobiłbym:
źródło
ROW_NUMBER
funkcję. Na przykład użyłem tego rozwiązania w SQLite.Działa to na SQL Server 2005 (edytowany w celu odzwierciedlenia twoich wyjaśnień):
źródło
źródło
r
. naprawiony.Robię to w ten sposób:
aktualizacja: Ten przykład GROUP BY działa tylko w MySQL i SQLite, ponieważ te bazy danych są bardziej liberalne niż standardowy SQL dotyczący GROUP BY. Większość implementacji SQL wymaga, aby wszystkie kolumny na liście wyboru, które nie są częścią wyrażenia agregującego, również znajdowały się w grupie GROUP BY.
źródło
Jeśli użyjemy SQL Server> = 2005, możemy rozwiązać zadanie za pomocą tylko jednego wyboru :
źródło
top 1
działa zcase
instrukcją worder by
klauzuli zwracającej 0 lub 1?Jeśli wiesz, jakie są sekcje, możesz:
źródło
Wiem, że ten wątek jest trochę stary, ale właśnie wpadłem na podobny problem (wybierz najnowszy artykuł z każdej kategorii) i oto rozwiązanie, które wymyśliłem:
Jest to bardzo podobne do rozwiązania Darrela, ale rozwiązuje problem RANK, który może zwrócić więcej wierszy niż planowano.
źródło
JOIN
zamiastLEFT JOIN
, ponieważ nigdy nie będzie rekorduTopCategoryArticles
bez odpowiedniegoArticle
rekordu.Próbowałem następujących rzeczy i to również działało z więzami.
źródło
Jeśli chcesz produkować wyniki pogrupowane według sekcji, wyświetlając tylko górne n rekordów z każdej sekcji mniej więcej tak:
... to poniższe powinny działać dość ogólnie ze wszystkimi bazami danych SQL. Jeśli chcesz 10 najlepszych, po prostu zmień 2 na 10 pod koniec zapytania.
Ustawić:
źródło
Czy operator UNION może dla ciebie pracować? Posiadaj jeden WYBÓR dla każdej sekcji, a następnie ZJEDNOCZENIE je razem. Chyba zadziałałoby to tylko dla określonej liczby sekcji.
źródło
Q) Wyszukiwanie rekordów TOP X z każdej grupy (Oracle)
Wybrano 6 wierszy.
źródło
Chociaż pytanie dotyczyło programu SQL Server 2005, większość ludzi przeszło do przodu i jeśli znajdzie to pytanie, w innych sytuacjach preferowaną odpowiedzią jest skorzystanie z niego,
CROSS APPLY
jak pokazano w tym poście na blogu .To zapytanie obejmuje 2 tabele. Zapytanie OP dotyczy tylko 1 tabeli, w przypadku której rozwiązanie oparte na funkcji okna może być bardziej wydajne.
źródło
Możesz wypróbować to podejście. To zapytanie zwraca 10 najbardziej zaludnionych miast dla każdego kraju.
źródło