W SQL opcja WITH TIES jest stosowana razem z ORDER BY i konstrukcją ograniczającą liczbę wierszy (TOP lub FETCH FIRST ... ROWS ONLY). Umożliwia zwrócenie nie tylko dokładnie N pierwszych wierszy, ale także wszystkich wierszy, których wartości w polu sortowania są zgodne z ostatnim (N-tym) wierszem.
Kiedy to jest potrzebne: przy analizach, rankingach, leaderboardach, kiedy ważne jest uwzględnienie "remisów" lub grup o tej samej pozycji.
Przykład (SQL Server):
SELECT TOP 3 WITH TIES * FROM Sales ORDER BY Amount DESC;
Jeśli 3. i 4. miejsce mają tę samą sumę sprzedaży, zwrócone zostaną oba wiersze.
W PostgreSQL:
SELECT * FROM Sales ORDER BY Amount DESC FETCH FIRST 3 ROWS WITH TIES;
Ważne: zadziała tylko z ORDER BY, w przeciwnym razie wynik będzie nieprzewidywalny.
Czym różni się po prostu
TOP N/LIMITod użyciaWITH TIES?
Częsta błędna odpowiedź: "WITH TIES po prostu ogranicza wiersze, to synonim".
Poprawna odpowiedź:
TOP N/LIMIT — zwróci dokładnie N wierszy, nawet jeśli następne mają tę samą wartość sortowania.WITH TIES — doda wszystkie wiersze, których pole sortowania jest zgodne z ostatnim (N-tym).Przykład:
-- Wybierz 2 najlepsze wyniki, ale jeśli jest "remis" — otrzymaj też je: SELECT TOP 2 WITH TIES Name, Score FROM Results ORDER BY Score DESC;
Historia
Projekt: Konkurs rankingów studenckich. Błąd: Użyto po prostu
LIMIT 3, a kilku studentów z tym samym wynikiem wypadło z listy zwycięzców — rzeczywiści laureaci zostali błędnie „odcięci”.
Historia
Projekt: Analiza e-commerce. Błąd: Chcieli pokazać top-5 popularnych produktów, ale przy tym samym SKU ze sprzedaży pokazywano tylko pierwsze 5, a później podczas audytu zauważono, że część hitów nie trafiła do raportu.
Historia
Projekt: Raportowanie wyników sprzedaży filii. Błąd: Klient oczekiwał zobaczyć wszystkich liderów przy równych wynikach, ale programista nie wiedział o WITH TIES — wyniki były nieprawidłowe, klient złożył reklamację dotyczącą jakości danych.