SQL-työhaastatteluun valmistautuminen · Oppitunti

Sarjan aukkojen etsiminen

Tunnista puuttuvat arvot sekä kunkin aukon alku ja loppu

Oppitunti 3/413 vaihetta

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- tai LAG-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 symmetrinen LAG) 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_series puuttuu.
  • 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.

Aloita maksutta

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

  1. Gaps-and-Islands-ongelman tunnistaminen
  2. Rivinumeron erotustemppu
  3. Sarjan aukkojen etsiminen
  4. Jaksot päivämäärä- ja tilamuutosten avulla
← Takaisin: SQL-työhaastatteluun valmistautuminen