Monthly Archives: Wrzesień 2014

Polecenie TOP z argumentem WITH TIES

2014-09-15

W dzisiejszym wpisie pokażę dosyć mało znaną konstrukcję TOP…WITH TIES. Muszę przyznać, że sam trafiłem na nią całkiem niedawno mimo, iż była ona dostępna już w SQL Server 2000. Załóżmy, że mamy pewien zbiór danych:

ties1

Teraz chcemy wybrać trzy firmy o największej sprzedaży. Company C i Company D mają taką samą wartość więc oczekujemy, że obie firmy znajdą się w wynikach zapytania. Niestety standardowe polecenie TOP 3 zwróci nam dokładnie trzy rekordy, pomijając wyniki ex-aequo.

Do tej pory w celu rozwiązania powyższego problemu stosowałem funkcję RANK(). Najpierw tworzyłem zapytanie z dodatkową kolumną rankingową:

select
  Company,
  TotalSales,
  rank() over(order by TotalSales desc) r
from Sales

Dzięki czemu otrzymywałem taki oto zbiór:

ties2

Następnie tworzyłem ostateczne zapytanie:

select
  Company,
  TotalSales
from
(
  select
    Company,
    TotalSales,
    rank() over(order by TotalSales desc) r
  from Sales
) Sales
where r <= 3

Otrzymując oczekiwane dane:

ties3

Okazuje się jednak, że dzięki poleceniu TOP z argumentem WITH TIES otrzymamy dokładnie ten sam wynik:

select top 3 with ties
  Company,
  TotalSales
from Sales
order by TotalSales desc

Dodanie do polecenia TOP klauzuli WITH TIES powoduje dołączenie do wynikowego zbioru danych wszystkich rekordów posiadających takie same wartości w kolumnach ORDER BY jak ostatni zwrócony rekord.

Najbliższe wydarzenia

2014-09-03

Nadchodząca jesień zapowiada się niezwykle ciekawie pod względem wydarzeń w świecie dev. Oto lista zbliżających się konferencji poświęconych technologiom .NET/SQL Server:

Ja zamierzam wybrać się na .NET DeveloperDays i SQLDay. Do zobaczenia 🙂