NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole
Haastattelijoiden suosima erikoistapaus: käsittele liian vähäiset rivit hallitusti
NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Haastattelijoiden suosima poikkeustapaus
Kun olette ratkaisseet N:nneksi korkeimman arvon kyselyn, haastattelija kysyy: "Mitä jos taulussa on vähemmän kuin N toisistaan poikkeavaa palkkaa? Haluan yhden NULL-arvon, en tyhjää tulosta."
Tämä kysymys erottaa kyselyn ulkoa opetelleet ehdokkaat niistä, jotka ymmärtävät tulosjoukon käyttäytymisen. Monet ratkaisut palauttavat huomaamatta nolla riviä yhden NULL-arvon sisältävän rivin sijaan.
Tässä oppitunnissa keskitytään siihen, miten pakotetaan tulokseksi täsmälleen yksi rivi, jonka arvo on NULL, kun N:nnettä arvoa ei ole.
Miksi pelkkä DENSE_RANK ei palauta rivejä
Palautetaan mieleen tavallinen N:nneksi korkeimman arvon kysely. Jos toisistaan poikkeavia palkkoja on vain kaksi ja pyydätte kolmanneksi korkeinta, WHERE rnk = 3 ei löydä yhtään osumaa, joten kysely palauttaa tyhjän joukon: nolla riviä.
Tyhjä joukko ei ole sama asia kuin NULL-arvon sisältävä rivi. Jos vaatimus on "palauta NULL", tyhjä tulos ei läpäise testiä, vaikka taustalla oleva logiikka olisi oikein.
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3; -- returns NO rows if fewer than 3 distinct salariesKorjaus 1: kääri kysely ulompaan SELECT-lauseeseen
Yksinkertaisin luotettava korjaus on tehdä koko N:nneksi korkeimman arvon kyselystä skalaarialikysely yhden SELECT-lauseen sisään. Jos skalaarialikysely ei löydä yhtään riviä, sen arvoksi tulee NULL, ja ulompi SELECT tuottaa aina täsmälleen yhden rivin.
Tämä on LeetCode-tyylisten "palauta NULL" -tehtävien vakiovastaus, ja se toimii kaikissa SQL-murteissa.
SELECT (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2 -- N = 3
) AS third_highest;Miksi skalaarialikysely toimii
Haluttu toiminta perustuu kahteen sääntöön:
- Skalaarialikyselyn on palautettava enintään yksi arvo. Jos se ei palauta yhtään riviä, SQL käyttää arvona
NULL. - Ulompi SELECT-lause, jossa ei ole
FROM-lausetta (tai jossa on yksirivinen lähde), tuottaa aina täsmälleen yhden rivin.
Kun sisempi kysely löytää N:nnen arvon, saatte sen; kun se ei löydä mitään, saatte yhden rivin, jonka arvona on NULL. Tämä vastaa täsmälleen haastattelijan määrittämää vaatimusta.
Korjaus 1 DENSE_RANK-versiolla
Sama kääre toimii myös ikkunafunktiota käyttävän ratkaisun ympärillä. Sijoittakaa rankattu kysely skalaarialikyselyn sisään; jos millään rivillä ei ole sijaa N, alikyselyn arvoksi tulee NULL ja ulompi SELECT palauttaa silti yhden rivin.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3
) AS third_highest;Korjaus 2: MAX palauttaa NULLin automaattisesti
Palautetaan mieleen ensimmäisen oppitunnin MAX-arvon alle jäävän MAX-arvon idea. Nollaan riviin kohdistuva aggregaattifunktio palauttaa NULL-arvon ja tuottaa silti yhden rivin. Toiseksi korkeimman arvon tapauksessa tämä on selkeä yhden rivin ratkaisu, joka täyttää NULL-vaatimuksen sellaisenaan.
Haittapuolena on se, että pelkkien sisäkkäisten MAX-funktioiden laajentaminen mielivaltaiselle N:lle muuttuu hankalaksi, joten tämä sopii parhaiten juuri toiseksi korkeimman arvon hakemiseen.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Korjaus 3: COALESCE ja oletusarvo
Jos ympäristönne takaa yhden rivin palautumisen, mutta arvo saattaa puuttua jostakin muusta syystä, voitte käyttää tuloksen ympärillä COALESCE-funktiota antamaan sille eksplisiittisen oletusarvon.
Huomioikaa, että COALESCE auttaa vasta, kun rivi on olemassa. Se ei muuta tyhjää tulosjoukkoa riviksi. Yhdistäkää se siis skalaarialikyselykääreeseen, joka takaa rivin, ja käyttäkää sen jälkeen arvolle COALESCE-funktiota, jos haluatte jonkin muun arvon kuin NULL, esimerkiksi 0:n.
SELECT COALESCE((
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;Mikä EI korjaa ongelmaa
Varokaa korjauksia, jotka näyttävät oikeilta mutta eivät toimi:
COALESCE-funktion lisääminen suoraan nolla riviä palauttavan kyselyn ympärille ei tee mitään, koskaCOALESCE-funktiolle ei ole riviä käsiteltäväksi.IFNULL- jaISNULL-funktioilla on sama rajoitus kuinCOALESCE-funktiolla.LIMIT 1ei luo riviä, jos yksikään rivi ei täyttänyt ehtoa.
Rivimäärän ongelma on ratkaistava skalaarialikyselykääreellä tai aggregaattifunktiolla, ei pelkillä NULL-arvon korvaamiseen tarkoitetuilla funktioilla.
Esimerkki: kun kahdesta pyydetään kolmatta
Palkat: 500, 500, 300. Toisistaan poikkeavia palkkoja on vain 500 ja 300, joten kolmanneksi korkeinta palkkaa ei ole.
- Pelkkä DENSE_RANK ja WHERE rnk = 3: palauttaa nolla riviä. Ei täytä vaatimusta.
- Skalaarialikyselykääre: sisempi kysely ei löydä mitään, joten ulompi SELECT palauttaa yhden rivin:
NULL. Täyttää vaatimuksen. - COALESCE(..., 0): palauttaa yhden rivin:
0, jos numeerista oletusarvoa pyydettiin.
Ratkaisun selittäminen haastattelussa
Saadaksenne pisteitä selittäkää ratkaisu ääneen:
- "Naivi kysely palauttaa tyhjän joukon, ei NULL-arvoa, joten käärittelen sen skalaarialikyselyyn taatakseni yhden rivin."
- "Skalaarialikyselyn arvoksi tulee NULL, kun osumia ei ole, mikä vastaa täsmälleen vaatimusta."
- "Jos NULL-arvon sijaan halutaan oletusarvo, kuten 0, lisään alikyselyn ympärille COALESCE-funktion."
Kysymyksen ydin on osoittaa, että ymmärrätte rivimäärän ja arvon eri merkitykset.
Kaikki yhdessä
Vankka, parametrisoitava ratkaisu N:nneksi korkeimman arvon tai NULL-arvon hakemiseen: rankatkaa toisistaan poikkeavat palkat, suodattakaa sijalle N osuvat rivit skalaarialikyselyn sisällä ja antakaa ulomman SELECT-lauseen taata yksi rivi.
Tämä yksi kysely käsittelee duplikaatit (DENSE_RANK-funktion avulla), yleistyy mille tahansa N:lle ja palauttaa NULL-arvon siististi, kun N ylittää toisistaan poikkeavien palkkojen määrän.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = :n
LIMIT 1
) AS nth_highest;Pikatarkistus
Pohtikaa rivimäärän ja NULL-arvojen välistä eroa.
Kertaus
Kun N ylittää käytettävissä olevien toisistaan poikkeavien palkkojen määrän, pelkkä rankkauskysely palauttaa tyhjän joukon, ei NULL-arvoa.
- Käärikää N:nneksi korkeimman arvon kysely ulompaan SELECT-lauseeseen sijoitettuun skalaarialikyselyyn, jotta tuloksena on aina yksi rivi ja arvoksi tulee
NULL, kun mikään arvo ei täytä ehtoa. - MAX-arvon alle jäävä MAX-rakenne palauttaa
NULL-arvon automaattisesti toiseksi korkeimman arvon tapauksessa. - COALESCE korvaa arvon vasta, kun rivi on olemassa; se ei voi muuttaa nollaa riviä yhdeksi riviksi.
Erottakaa aina rivimäärä arvosta, kun haastattelija kysyy NULL-arvon hallitusta palauttamisesta.
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 ”NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole” ilmainen?
Kyllä – oppitunnin ”NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole” 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 ”NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole”?
Haastattelijoiden suosima erikoistapaus: käsittele liian vähäiset rivit hallitusti 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 4/4.
Kuinka kauan ”NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole”-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
- Toiseksi suurin palkka viidellä tavalla
- N:nneksi suurin arvo DENSE_RANK-funktiolla
- Osaston suurimman ansion saaja
- NULL-arvon palauttaminen, kun N:nnettä arvoa ei ole