Voorbereiding op SQL-sollicitatiegesprekken · Les

N opeenvolgende rijen die aan een voorwaarde voldoen

Het klassieke patroon voor een periode met bijvoorbeeld drie opeenvolgende dagen waarop de verkoop hoger is dan X.

Les 3 van 413 stappen

N opeenvolgende rijen die aan een voorwaarde voldoen is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.

Een LeetCode-klassieker

Dit is een van de vaakst gestelde SQL-vragen tijdens interviews: "Vind alle datums met minstens drie opeenvolgende dagen waarop de verkopen een drempelwaarde overschreden," of de favoriete LeetCode-vraag "rapporteer het stadion met minstens 3 opeenvolgende rijen met meer dan 100 bezoekers."

De structuur is altijd hetzelfde: een rij voldoet alleen als die deel uitmaakt van een reeks van N opeenvolgende rijen die aan de voorwaarde voldoen. Deze les laat twee duidelijke oplossingen zien en de valkuil waar de meeste kandidaten intrappen.

De voorbeeldgegevens

We gebruiken een dagelijkse tabel met sales-gegevens. De voorwaarde is amount > 100. We moeten elke dag teruggeven die deel uitmaakt van een reeks van 3 of meer opeenvolgende kalenderdagen waarop allemaal aan de voorwaarde wordt voldaan.

  • sale_date — één rij per dag
  • amount — totale verkopen op die dag

Belangrijke nuance: de rijen moeten opeenvolgend zijn in de volgorde, en bij datumvarianten ook opeenvolgend in de kalender.

SELECT * FROM sales ORDER BY sale_date;
-- sale_date  | amount
-- 2024-03-01 |  120
-- 2024-03-02 |  150
-- 2024-03-03 |  130
-- 2024-03-04 |   90
-- 2024-03-05 |  200

Aanpak 1: eerst filteren, dan eilanden

De robuuste aanpak: houd eerst alleen rijen die aan de voorwaarde voldoen, groepeer de overgebleven rijen vervolgens in opeenvolgende eilanden en behoud daarna de eilanden met een lengte van minstens N.

Stap één is het WHERE-filter. Stap twee gebruikt het anker voor hiaten en eilanden opnieuw. Omdat we eerst filterden, betekent een eiland hier "een reeks van opeenvolgende dagen die allemaal aan de voorwaarde voldoen".

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;

Reeksen die aan de voorwaarde voldoen verankeren

Nummer de rijen die aan de voorwaarde voldoen op datum en trek dit nummer af om het anker van het eiland te krijgen. Rijen die opeenvolgend zijn op de kalender EN allemaal aan de voorwaarde voldoen, hebben hetzelfde anker; elke dag die niet aan de voorwaarde voldoet, is verwijderd en onderbreekt de reeks precies waar dat hoort.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;

Eilanden met voldoende lengte behouden

Groepeer op het anker, tel de rijen en behoud alleen groepen met COUNT(*) >= 3. Als de interviewer de afzonderlijke datums waarop aan de voorwaarde is voldaan terug wil, koppel dan de behouden ankers aan de genummerde rijen.

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Aanpak 2: schuivend COUNT-venster

Een elegantere aanpak wanneer N klein en vast is: gebruik een vensterkader om te tellen hoeveel van de omliggende rijen ook aan de voorwaarde voldoen. Als een venster van N opeenvolgende rijen waarin deze rij staat volledig aan de voorwaarde voldoet, staat de rij in het resultaat.

Voeg eerst een booleaanse markering toe en tel die vervolgens op over schuivende vensterkaders.

SELECT sale_date, amount,
  CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;

Optellen over drie vensterkaders

Voor een reeks van precies 3 staat een rij in het resultaat als het venster van 3 rijen dat hier eindigt, hier gecentreerd is of hier begint, optelt tot 3. Bereken de drie voortschrijdende sommen en controleer of een ervan gelijk is aan 3.

Dit is de techniek achter de oplossing voor LeetCode 601 (Human Traffic of Stadium).

WITH flagged AS (
  SELECT sale_date, amount,
    CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
  FROM sales
),
w AS (
  SELECT *,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
  FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);

De valkuil van hiaten in de kalender

De aanpak met de venstersom gebruikt ROWS, dat aangrenzende resultaatrijen telt en niet aangrenzende kalenderdagen. Als een dag waarop niet aan de voorwaarde wordt voldaan al is weggefilterd, kunnen twee rijen aangrenzend zijn in het resultaat zonder opeenvolgend te zijn op de kalender.

Les: pas het schuivende venster toe op de volledige dagelijkse reeks (filter niet vooraf), of gebruik de datum-ankermethode, die automatisch rekening houdt met hiaten in de kalender. Benoem deze afweging tijdens het interview.

Generaliseren naar elke N

Aanpak 1 (eerst filteren, dan eilanden) generaliseert vanzelf: wijzig gewoon HAVING COUNT(*) >= N. Dat is het grote voordeel ten opzichte van de som van meerdere vensters, waarvoor meer vensterkaders nodig zijn naarmate N groeit.

Kies bij een geparameteriseerde of grote N voor de eilandmethode — dat vereist één aanpassing van de drempel in plaats van N−1 met de hand geschreven vensters.

-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5

Een aanpak kiezen

Een korte beslisgids om hardop te geven:

  • Eerst filteren, dan eilanden: houdt rekening met hiaten in de kalender, werkt voor elke N en geeft volledige reeksen terug — de veilige standaardkeuze.
  • Som van een schuivend venster: elegant voor een vaste, kleine N in een dichte dagelijkse reeks, maar let op de valkuil van ROWS versus de kalender.

Beide benoemen en daarna je keuze onderbouwen is precies wat interviewers voor functies van medior tot senior waarderen.

Volledige oplossing

De databaseonafhankelijke oplossing voor elke N die rekening houdt met opeenvolgende kalenderdagen en de datums teruggeeft waarop aan de voorwaarde wordt voldaan:

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Korte controle

Vind de subtiele fout.

Samenvatting

Voor N opeenvolgende rijen die aan een voorwaarde voldoen:

  • Eerst filteren, dan eilanden: behoud rijen die aan de voorwaarde voldoen, veranker ze met date - ROW_NUMBER(), groepeer ze en gebruik HAVING COUNT(*) >= N. Deze aanpak werkt voor elke N en houdt rekening met hiaten in de kalender.
  • Som van een schuivend venster: markeer rijen en tel ze op over vaste vensters van N rijen; elegant, maar let bij vooraf gefilterde gegevens op het verschil tussen ROWS en de kalender.

Hierna: de huidige actieve reeks van een gebruiker tot en met vandaag berekenen.

Gratis beginnen

Leer SQL met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “N opeenvolgende rijen die aan een voorwaarde voldoen” gratis?

Ja — de volledige tekst van “N opeenvolgende rijen die aan een voorwaarde voldoen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.

Wat leer ik in “N opeenvolgende rijen die aan een voorwaarde voldoen”?

Het klassieke patroon voor een periode met bijvoorbeeld drie opeenvolgende dagen waarop de verkoop hoger is dan X. Je oefent met Voorbereiding op SQL-sollicitatiegesprekken door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Voorbereiding op SQL-sollicitatiegesprekken te beginnen?

Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “N opeenvolgende rijen die aan een voorwaarde voldoen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op SQL-sollicitatiegesprekken?

Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Opeenvolgende kalenderdagen detecteren
  2. Langste reeks per gebruiker
  3. N opeenvolgende rijen die aan een voorwaarde voldoen
  4. Huidige actieve reeks tot vandaag
← Terug naar Voorbereiding op SQL-sollicitatiegesprekken