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.

Reklamy

Posted on 2014-09-15, in SQL Server and tagged , , , . Bookmark the permalink. 2 komentarze.

  1. Dzięki za wyjaśnienie – pomocne 🙂

  2. dzięki działa here

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: