Sarjan aukkojen etsiminen
Tunnista puuttuvat arvot sekä kunkin aukon alku ja loppu
Sarjan aukkojen etsiminen on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 3/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 SQL-työhaastatteluun valmistautuminen-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.
Nyt etsitään aukkoja
Tähän asti olemme ryhmitelleet rivit saarekkeiksi. Haastattelukysymyksen peilikuva kuuluu: mitkä arvot puuttuvat? Haastattelija voi muotoilla tehtävän esimerkiksi näin: "etsi aukot tästä tunnusjonosta", "mitkä laskunumerot ohitettiin" tai "minä päivinä ei ollut toimintaa".
Älä ajattele aukkoja saarekkeiden välisinä tyhjinä kohtina. Olennaista on yleensä se, ettei jokaista puuttuvaa arvoa tarvitse luetella erikseen, vaan riittää ilmoittaa kunkin aukkoalueen alku ja loppu. Tämä on paljon tiiviimpää ja vastaa haastattelijoiden odotuksia.
Esimerkkiaineisto aukoille
Käytä uudelleen taulun seq(n) olemassa olevia arvoja 1, 2, 3, 7, 8, 10. Ilmoitettavat aukot ovat:
- 4–6 (ensimmäisen saarekkeen jälkeen ja ennen arvoa 7)
- 9–9 (arvojen 8 ja 10 välissä)
Huomaa, että kuvaamme aukon alueena: gap_start = viimeinen olemassa oleva arvo + 1, gap_end = seuraava olemassa oleva arvo - 1. Tämä tiivis esitystapa on alla esiteltävän ydintekniikan tavoite.
CREATE TABLE seq (n INT);
INSERT INTO seq VALUES (1),(2),(3),(7),(8),(10);LEAD-menetelmä aukkojen etsimiseen
Selkein aukkojen tunnistin vertaa kutakin riviä seuraavaan riviin LEAD-funktion avulla. Jos seuraava arvo on yli 1 suurempi kuin nykyinen arvo, niiden välissä on aukko.
Kunkin tällaisen rivin kohdalla aukko alkaa kohdasta n + 1 ja päättyy kohtaan next_n - 1. Tarkastele ensin LEAD-funktion raakaa tulosta:
SELECT
n,
LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
ORDER BY n;Aukkoalueiden ilmoittaminen
Sijoita LEAD-tulos CTE:hen ja pidä mukana vain rivit, joilla hyppy seuraavaan arvoon on suurempi kuin 1. Nämä rivit osoittavat aukot:
Tulos on täsmälleen aukko 4–6 ja aukko 9–9. Lauseke next_n - n - 1 antaa lisäksi kussakin aukossa puuttuvien arvojen määrän, jota kysytään usein jatkokysymyksenä.
WITH stepped AS (
SELECT n, LEAD(n) OVER (ORDER BY n) AS next_n
FROM seq
)
SELECT
n + 1 AS gap_start,
next_n - 1 AS gap_end,
next_n - n - 1 AS missing_count
FROM stepped
WHERE next_n - n > 1
ORDER BY gap_start;Symmetrinen LAG-vaihtoehto
Voit tunnistaa samat aukot tarkastelemalla rivejä taaksepäin LAG-funktion avulla. Aukko on olemassa ennen nykyistä riviä, kun edellinen arvo on yli 1 pienempi kuin nykyinen.
Menetelmä on täysin vastaava, joten valitse kysymyksen kannalta luontevammin luettava vaihtoehto. Jotkut haastattelijat suosivat LEAD-funktiota, koska aukko kuvataan sitä edeltävän rivin perusteella, mikä vastaa luontevaa puhetapaa.
WITH stepped AS (
SELECT n, LAG(n) OVER (ORDER BY n) AS prev_n
FROM seq
)
SELECT prev_n + 1 AS gap_start,
n - 1 AS gap_end
FROM stepped
WHERE n - prev_n > 1
ORDER BY gap_start;Kaikkien puuttuvien arvojen luetteleminen
Joskus haastattelija haluaa todella täydellisen luettelon puuttuvista luvuista eikä vain alueita. Luotettava tapa on muodostaa koko odotettu jono ja tehdä sille anti-join olemassa olevia arvoja vastaan. Postgresissa generate_series muodostaa koko alueen:
Jokainen odotetulla välillä oleva kokonaisluku, jota ei löydy taulusta seq, on puuttuva arvo. Tämä käsittelee myös aukot aivan reunoilla, jos tiedät tarkoitetun minimi- ja maksimiarvon.
SELECT g.n AS missing_value
FROM generate_series(
(SELECT MIN(n) FROM seq),
(SELECT MAX(n) FROM seq)
) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL
ORDER BY g.n;Jonojen muodostaminen eri SQL-murteissa
Kaikissa tietokantamoottoreissa ei ole funktiota generate_series. Tunne vaihtoehdot:
- Postgres:
generate_series(1, 100). - SQL Server: rekursiivinen CTE tai numero-/tally-taulu.
- MySQL 8: rekursiivinen CTE, joka laskee suurimpaan arvoon asti.
Rekursiivinen CTE on siirrettävä varavaihtoehto. Se tuottaa saman odotetun jonon, johon olemassa olevia arvoja voidaan verrata anti-joinilla.
WITH RECURSIVE nums AS (
SELECT (SELECT MIN(n) FROM seq) AS n
UNION ALL
SELECT n + 1 FROM nums
WHERE n + 1 <= (SELECT MAX(n) FROM seq)
)
SELECT nums.n AS missing_value
FROM nums
LEFT JOIN seq s ON s.n = nums.n
WHERE s.n IS NULL;Aukot kalenteripäivissä
Puuttuvia päivämääriä varten muodosta täydellinen kalenteri päivittäisellä askeleella ja tee anti-join. Tämä on tavallinen kysely, jolla selvitetään, "minä päivinä ei ollut tilauksia":
Yhdistä tähän alueiden käsittelytekniikka soveltamalla LEAD-funktiota todellisiin päivämääriin. Näin voit ilmoittaa yksittäisten päivien sijaan puuttuvien päivämäärien jaksot ja käyttää rajoina lauseketta + INTERVAL '1 day'.
SELECT d::date AS missing_day
FROM generate_series(
DATE '2026-01-01', DATE '2026-01-31',
INTERVAL '1 day') AS d
LEFT JOIN daily_logins l ON l.login_date = d::date
WHERE l.login_date IS NULL
ORDER BY missing_day;Aineiston ulkopuoliset reuna-aukot
Hienovarainen sudenkuoppa: LEAD/LAG löytää vain olemassa olevien arvojen välissä olevat aukot. Jos numero puuttuu ennen pienintä tai suurimman olemassa olevan arvon jälkeen, ikkunamenetelmä ei voi havaita sitä, koska naapuririviä ei ole.
Jos haastattelija määrittelee odotetun kokonaisen alueen (esimerkiksi tunnukset 1–100) ja aineistosi alkaa arvosta 5, sinun on käytettävä ilmoitetun alueen rajoittamaa generate-series anti-join -menetelmää aineiston oman minimi- ja maksimiarvon sijaan. Varmista aina, ovatko odotetut rajat kiinteät.
SELECT g.n AS missing_value
FROM generate_series(1, 100) AS g(n)
LEFT JOIN seq s ON s.n = g.n
WHERE s.n IS NULL;Ryhmäkohtainen aukkojen tunnistus
Käyttäjäkohtaisia aukkoja varten osita LEAD/LAG ryhmäsarakkeen mukaan, jotta aukkoa ei koskaan ilmoiteta kahden eri käyttäjän tietovirtojen välille:
Kunkin käyttäjän puuttuvat alueet lasketaan itsenäisesti. Kuten saarekkeissa, osituksen unohtaminen yhdistää käyttäjät huomaamatta ja tuottaa näennäisiä aukkoja toisiinsa liittymättömien rivien väliin.
WITH stepped AS (
SELECT user_id, n,
LEAD(n) OVER (PARTITION BY user_id ORDER BY n) AS next_n
FROM seq_per_user
)
SELECT user_id, n + 1 AS gap_start, next_n - 1 AS gap_end
FROM stepped
WHERE next_n - n > 1
ORDER BY user_id, gap_start;Oikean aukkomenetelmän valitseminen
Haastattelua varten päätösohje:
- Haluat tiiviit alueet ja vain sisäiset aukot: käytä
LEAD- taiLAG-funktiota ja suodata mukaan rivit, joilla askel on suurempi kuin 1. - Haluat jokaisen puuttuvan arvon erikseen tai aineiston reunojen ulkopuoliset aukot: käytä generate-series anti-join -menetelmää ilmoitettua kokonaista aluetta vastaan.
Kun mainitset molemmat vaihtoehdot ja kerrot, milloin kumpaakin käytetään, osoitat ymmärtäväsi aiheen syvällisesti. LEAD-menetelmä on kevyempi, kun taas jonomenetelmä on kattavampi.
Pikatarkistus
Tarkenna reuna-aukon aiheuttama erikoistapaus.
Kertaus: aukkojen etsiminen
Aukkojen tunnistus hallussa:
- Ilmoita aukot alueina: gap_start = arvo + 1, gap_end = seuraava_arvo - 1.
LEAD(tai symmetrinenLAG) löytää sisäiset aukot tehokkaasti, kun mukaan suodatetaan tapaukset, joissa askel on suurempi kuin 1.- generate-series anti-join luettelee kaikki puuttuvat arvot ja löytää ilmoitettuun alueeseen perustuvat reuna-aukot.
- Rekursiiviset CTE:t muodostavat jonon siellä, missä
generate_seriespuuttuu. - Osita tiedot ryhmäsarakkeen mukaan käyttäjäkohtaisia aukkoja varten.
- Varmista aina odotetut rajat.
Lopuksi käsittelemme monipuolisimman muunnelman: päivämäärän ja tilan muutosten määrittämät saarekkeet.
Opi SQL 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
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Sarjan aukkojen etsiminen” ilmainen?
Kyllä – oppitunnin ”Sarjan aukkojen etsiminen” 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 SQL-työhaastatteluun valmistautuminen-kurssin, päivitä CoddyKit PROhon. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Sarjan aukkojen etsiminen”?
Tunnista puuttuvat arvot sekä kunkin aukon alku ja loppu Harjoittelet SQL-työhaastatteluun valmistautuminen-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL-työhaastatteluun valmistautuminen-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL-työhaastatteluun valmistautuminen-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Sarjan aukkojen etsiminen”-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ä SQL-työhaastatteluun valmistautuminen-oppitunnilla?
Kyllä. Jokainen SQL-työhaastatteluun valmistautuminen-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
- Gaps-and-Islands-ongelman tunnistaminen
- Rivinumeron erotustemppu
- Sarjan aukkojen etsiminen
- Jaksot päivämäärä- ja tilamuutosten avulla