SQL Server Fereastra Funcții de RANG, DENSE_RANK și NTILE


De: Koen Verbeeck
Prezentare

tema aceasta parte este vorba despre funcții de rang. Acestea au fost introduse în sqlserver 2005. ROW_NUMBER este, de asemenea, o funcție de clasament, dar a fost deja acoperităextensiv în partea anterioară a acestui tutorial.

RANK și DENSE_RANK

în contrast cu funcția ROW_NUMBER,RANK andDENSE_RANK nu trebuie să genereze numere unice. Diferența dintretoate aceste funcții este modul în care se ocupă de legături.,ROW_NUMBER va genera întotdeauna valori unice fără lacune, chiar dacăexistă legături.

  • rang poate avea lacune în secvența sa și atunci când valorile sunt aceleași, ajungacelași rang.
  • DENSE_RANK returnează, de asemenea, același rang pentru legături, dar nu are anygaps în secvență.
  • să ilustrăm cu un exemplu., Să presupunem că avem următoarele samplevalues:

    putem scrie următoarea interogare pentru a testa cele trei funcții de rang:

    Acest lucru ne dă acest set de rezultate:

    după Cum puteți vedea, RANG va reveni la același rang de legături. Cu toate acestea, următorul grup rankin A este numărul 3, omițând rangul 2. DENSE_RANK pe de altă parte doesn ‘ tskip locul 2. Când nu există legături în setul de înregistrări, toate cele trei funcții de clasarereturnați exact același rezultat.,

    cu ROW_NUMBER și RANK, putem crea o construcție alternativă pentru a detecta duplicaterows. Cu același eșantion de date utilizate gasesti 5 din acest tutorial, vom crea următoarea interogare pentru a găsi toate rowsthat au un duplicat de cheie de afaceri:

    setul De rezultate:

    Acum avem nevoie doar pentru a filtra pe înregistrările care a generat numărul de rând (RID) isdifferent de rang (RankID). Acest lucru va returna un record pentru Bob, așa că știm că există o înregistrare duplicat pentru acel angajat.

    când se utilizează RANK sau DENSE_RANK?,

    Cum se specifică înainte, RANG poate avea lacune în ordinea și DENSE_RANK nu.Să presupunem că aveți sarcina de a găsi top 5 clienților în funcție de valoarea vânzărilor.Cu rang, vă puteți clasifica clienții și apoi puteți filtra orice clienți cu arank mai mare decât 5. Dacă ar face același lucru cu DENSE_RANK, s-ar putea termina withmore 6 clienții!,

    să Presupunem că avem un set de date despre clienții noștri:

    atunci Când se adaugă rândurile cu RANG și DENSE_RANK, avem următorul set de date:

    atunci Când filtrarea pe rang <= 5, veți obține exact 5 rânduri s-a întors. Cu toate acestea,daca ai filtru pe denserank <= 5, veți obține 6 rânduri, care nu s-ar putea bewhat vrei. Cu cât sunt mai multe legături, cu atât mai multe rânduri DENSE_RANK se pot întoarce. În cazul în care cravata wouldbe exact numărul rândului 5, funcția rang ar reveni, de asemenea, 6 rânduri., În acest caz, trebuie să „rupeți cravata”. Puteți face acest lucru utilizând funcția ROW_NUMBERfunction sau prin sortarea pe coloana suplimentară.

    NTILE

    Ultima funcție de clasare este un pic specială. Nile împarte rândurile în mod durgăleți de dimensiuni egale. Să presupunem că aveți 20 de rânduri și specificați NTILE (2). Acest lucru vă va da 2 găleți cu 10 rânduri fiecare. Când utilizați NTILE (3), Obțineți 2 găleți CU7 rânduri și 1 găleată cu 6 rânduri.,

    Să reutilizați interogare din secțiunea anterioară, dar adaugă un expressionusing NTILE:

    Vom obține următoarele rezultate:

    Un exemplu în care NTILE a fost folosit pentru a împărți datele în găleți este descris în thetipHow pentru a crea o hartă de căldură grafic în SQL Server Reporting Services 2016.,

    Informații Suplimentare
    • Mai multe sfaturi despre funcții de rang:
      • SQL Server 2005 și 2008 Funcții de Rang DENSE_RANK și NTILE
      • SQL Server 2005 și 2008 Funcții de Rang Row_număr și Rangul
      • Uitat SQL Server-Funcții – VARP, SOUNDEX și NTILE

    Ultima Actualizare: 5/31/2018

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *