Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Tasatilanteiden käsittely Top-N-tuloksissa

Milloin RANK- tai DENSE_RANK-funktiota kannattaa käyttää, jotta kaikki tasatilanteen rivit sisällytetään

Oppitunti 2/413 vaihetta

Tasatilanteiden käsittely Top-N-tuloksissa on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Tasatilannetta koskeva jatkokysymys

Kun hallitsette top-N-haun ROW_NUMBER-funktion avulla, haastattelija vaikeuttaa tehtävää: "Mitä jos kahdella työntekijällä on täsmälleen sama palkka rajakohdassa? Pitäisikö molemmat sisällyttää tulokseen?"

Tämä erottaa yhden kyselyn ulkoa opetelleet ehdokkaat niistä, jotka ymmärtävät järjestysfunktioiden merkityksen. Vastaus riippuu siitä, valitaanko ROW_NUMBER, RANK vai DENSE_RANK. Tässä oppitunnissa yhdistetään kukin funktio liiketoiminnan tavoitteeseen.

ROW_NUMBER peittää tasatilanteet

ROW_NUMBER antaa kullekin riville ehdottoman yksilöllisen kokonaisluvun. Vaikka kaksi riviä olisi järjestyssarakkeen perusteella tasatilanteessa, toinen saa arvon 2 ja toinen arvon 3 jossakin mielivaltaisessa järjestyksessä.

Seurauksena suodatin WHERE rn <= 3 palauttaa täsmälleen 3 riviä ja saattaa huomaamatta jättää pois tasatilanteessa olevan rivin, joka olisi perustellusti pitänyt sisällyttää. Tämä on oikein, kun todella haluatte kiinteän määrän rivejä, mutta väärin, jos kaikkien tasatilanteessa olevien pitäisi päästä mukaan.

-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4  (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)

RANK jättää aukkoja

RANK antaa tasatilanteessa oleville riveille saman sijoituksen ja ohittaa sen jälkeen seuraavia sijoituksia tasatilanteen huomioimiseksi. Kaksi sijalla 2 olevaa riviä saavat molemmat arvon 2, ja seuraava rivi saa arvon 4, ei 3.

Käyttäkää RANK-funktiota, kun haluatte "kolme parasta sijoitusta" ja yhdellä sijalla voi olla useita henkilöitä. Tämä vastaa todellisia kilpailusijoituksia, joissa kaksi hopeamitalistia tarkoittaa, ettei pronssimitalistia ole.

-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4   (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)

DENSE_RANK ei jätä aukkoja

DENSE_RANK antaa tasatilanteessa oleville riveille niin ikään saman sijoituksen, mutta ei ohita seuraavaa sijoitusta. Kaksi sijalla 2 olevaa riviä saa molemmat arvon 2, ja seuraava eri arvo saa arvon 3.

Käyttäkää DENSE_RANK-funktiota, kun kysymys koskee eri arvoja: esimerkiksi "kolmea korkeinta eri palkkatasoa" tai "kolmea parasta hintaluokkaa". Se laskee yksilöllisiä arvoja, ei rivejä.

-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3   (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)

Vertailu rinnakkain

Palkkalistalla 100, 90, 90, 80 nämä kolme funktiota tuottavat seuraavat tulokset:

  • ROW_NUMBER: 1, 2, 3, 4
  • RANK: 1, 2, 2, 4
  • DENSE_RANK: 1, 2, 2, 3

Tämä taulukko kannattaa opetella ulkoa. Haastattelija voi yksinkertaisesti pyytää täyttämään sen tietyn listan perusteella, ja aukkojen käsittelyn ymmärtäminen on koko tehtävän ydin.

SELECT salary,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
  RANK()       OVER (ORDER BY salary DESC) AS rnk,
  DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;

Kaikkien tasatilanteessa olevien rivien sisällyttäminen RANK-funktion avulla

Kun haluatte vastata kysymykseen "kolme parasta, mutta kaikki rajakohdassa tasatilanteessa olevat mukaan", suodattakaa ehdolla RANK() <= 3. Jos kaksi henkilöä jakaa sijan 3, molemmat tulevat mukaan, joten tuloksessa voi olla yli 3 riviä.

Tätä tarkoitetaan yleensä, kun kysytään "kolmea parasta sijoitusta" eikä "mitä tahansa kolmea riviä". Mainitkaa selvästi, että rivien määrä voi tasatilanteissa ylittää N:n.

WITH ranked AS (
  SELECT name, department, salary,
         RANK() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rnk
  FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;

Kolme parasta eri tasoa DENSE_RANK-funktion avulla

Kun vaatimuksena on "kolme korkeinta eri palkkatasoa" ja haluatte mukaan jokaisen työntekijän näiltä kolmelta tasolta, käyttäkää ehtoa DENSE_RANK() <= 3.

Tämä voi palauttaa paljon rivejä: kaikki kolmen ylimmän palkkatason työntekijät riippumatta siitä, kuinka monta työntekijää kullakin tasolla on. Keskeinen havainto on, että DENSE_RANK laskee eri arvoja, joten suodatin valitsee arvotasot eikä kiinteää rivimäärää.

WITH ranked AS (
  SELECT name, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
  FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;

Valintaopas

Yhdistäkää kysymyksen sanamuoto funktioon:

  • "Täsmälleen N riviä" tai sivutus → ROW_NUMBER (lisätkää tasatilanteen ratkaiseva avain).
  • "N parasta sijoitusta, tasatilanteessa sama sijoitus" → RANK.
  • "N ylintä eri arvoa / tasoa / luokkaa" → DENSE_RANK.

Kun määrittely on epäselvä, kysykää: "Jos rajakohdassa on tasatilanne, sisällytetäänkö kaikki tasatilanteessa olevat rivit vai rajoitetaanko tulos N riviin?" Jo tämä tarkentava kysymys voi tuoda pisteitä.

Tasatilanteen ratkaisevat avaimet ovat silti tärkeitä

Myös käytettäessä RANK- tai DENSE_RANK-funktiota toissijainen ORDER BY-avain määrittää tasatilanteessa olevien rivien esitysjärjestyksen ja pitää tulosteen vakaana. Se ei muuta sitä, mitkä rivit kuuluvat tulokseen, mutta tekee tuloksista toistettavia.

ROW_NUMBER-funktion kanssa tasatilanteen ratkaiseva avain on olennainen, koska se määrää, mikä tasatilanteessa oleva rivi säilyy rn-suodatuksen jälkeen.

RANK() OVER (
  PARTITION BY department
  ORDER BY salary DESC, name ASC
) AS rnk

Esimerkki: parhaat pistetulokset

game_scores-taulussa ovat sarakkeet player ja score. Haastattelija haluaa "kaikki pelaajat kahdella parhaalla pistesijalla". Tasatilanne ensimmäisestä sijasta tarkoittaa, että kaksi pelaajaa on sijalla 1 ja seuraava eri pistemäärä on sijalla 2.

"Sijoitukset", joissa tasatilanteen jälkeen ei ohiteta sijoituksia, viittaavat DENSE_RANK-funktioon. Jos haastattelija sen sijaan puhuisi "kahdesta parhaasta sijoituksesta, joissa tasatilanteet aiheuttavat aukkoja", vaihtaisitte RANK-funktioon. Kuunnelkaa tarkasti käytettyä sanamuotoa.

WITH r AS (
  SELECT player, score,
         DENSE_RANK() OVER (ORDER BY score DESC) AS pos
  FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;

Yleisiä vältettäviä virheitä

Haastattelijat tarkkailevat seuraavia sudenkuoppia:

  • ROW_NUMBER-funktion käyttäminen, vaikka kysymys edellyttää tasatilanteessa olevien sisällyttämistä, jolloin kelpaava rivi putoaa huomaamatta.
  • RANK- ja DENSE_RANK-funktioiden aukkojen käsittelyn sekoittaminen.
  • Sen unohtaminen, että RANK- ja DENSE_RANK-suodattimet voivat palauttaa yli N riviä, minkä jälkeen tulosta väitetään virheelliseksi.
  • PARTITION BY-lausekkeen pois jättäminen, kun top-N lasketaan ryhmittäin, jolloin koko taulu järjestetään yhden ryhmän sijaan.

Pikatarkistus

Valitkaa kuvattuun tasatilanteeseen sopiva ranking-funktio.

Kertaus: Tasatilanteiden käsittely

Kolme funktiota, kolme tapaa käsitellä tasatilanteita:

  • ROW_NUMBER: aina yksilöllinen, täsmälleen N riviä, tasatilanteet ratkaistaan mielivaltaisesti.
  • RANK: saman arvon saaneet jakavat saman sijoituksen, minkä jälkeen sijoituksiin tulee aukkoja.
  • DENSE_RANK: saman arvon saaneet jakavat saman sijoituksen, aukkoja ei tule, ja funktio laskee eri arvot.

Valitkaa funktio kysymyksen sanamuodon perusteella, esittäkää tarkentava kysymys, jos asia on epäselvä, ja muistakaa, että RANK/DENSE_RANK-suodattimet voivat tarkoituksella palauttaa enemmän kuin N riviä.

Aloita maksutta

Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
90
Oppitunnit
360

Usein kysytyt kysymykset

Onko oppitunti ”Tasatilanteiden käsittely Top-N-tuloksissa” ilmainen?

Kyllä – oppitunnin ”Tasatilanteiden käsittely Top-N-tuloksissa” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tasatilanteiden käsittely Top-N-tuloksissa”?

Milloin RANK- tai DENSE_RANK-funktiota kannattaa käyttää, jotta kaikki tasatilanteen rivit sisällytetään Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Tasatilanteiden käsittely Top-N-tuloksissa”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?

Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ryhmän Top-N-rivit ROW_NUMBER-funktiolla
  2. Tasatilanteiden käsittely Top-N-tuloksissa
  3. Rivien turvallinen deduplikointi
  4. Avaimen viimeisimmän rivin säilyttäminen
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin