Förberedelse inför kodningsintervjuer · Lektion

Komplett uppsättning övningsintervjuer

Tidsbegränsade problem från början till slut som kombinerar joiner, fönsterfunktioner och CTE:er under intervjuliknande förhållanden.

Lektion 4 av 413 steg

Komplett uppsättning övningsintervjuer är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Så går en SQL-intervju till

Det här avslutande momentet låter er arbeta igenom fullständiga simulerade problem som kombinerar joins, fönsterfunktioner och CTE:er under intervjuliknande förhållanden. Först den övergripande färdigheten: hur ni bör agera under intervjun.

  • Formulera om problemet och bekräfta schemat.
  • Förtydliga kantfall (NULL-värden, lika resultat, dubbletter) innan ni kodar.
  • Beskriv er strategi och skriv sedan frågan.
  • Testa den mot ett litet exempel i huvudet.

Intervjuare bedömer er arbetsprocess i lika hög grad som den slutliga frågan.

Det gemensamma schemat

Alla problem nedan använder det här lilla e-handelschemat. Läs det en gång så att varje fråga blir begriplig.

  • customers(id, name, country)
  • orders(id, customer_id, order_date, status, amount)
  • order_items(order_id, product_id, quantity)
  • products(id, name, category, price)

Ha detta i åtanke; resten av lektionen hänvisar till de här tabellerna.

-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currency

Problem 1: Kunder med högst utgifter

"Returnera de tre kunder som totalt har betalat mest, med namn och totalsumma."

Strategi: filtrera fram betalda order, aggregera per kund, sortera och begränsa resultatet. Ange att ni utesluter annullerade och väntande order, ett kantfall som intervjuare brukar lägga in.

SELECT c.name,
       SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;

Problem 2: Kunder som aldrig har lagt en order

"Lista kunder som aldrig har lagt en order." Det här är mönstret anti-join. Två tydliga lösningar är LEFT JOIN med IS NULL eller NOT EXISTS.

Föredra NOT EXISTS eftersom det är NULL-säkert (till skillnad från NOT IN). Nämn den skillnaden; det är precis den insikt intervjuaren försöker få fram.

-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.id
);

Problem 3: Det näst högsta orderbeloppet

"Hitta det näst högsta unika orderbeloppet." Den renaste lösningen som hanterar lika resultat använder DENSE_RANK, så att identiska belopp får samma rang.

Ett kantfall att nämna: om det inte finns något näst högsta unikt värde returneras inga rader. Det kan vara acceptabelt eller kräva en COALESCE-wrapper beroende på kraven.

SELECT amount
FROM (
  SELECT amount,
         DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
  FROM orders
) ranked
WHERE rnk = 2;

Problem 4: Senaste ordern per kund

"Returnera varje kunds senaste order." Det här är mönstret för att behålla den senaste raden per nyckel, löst med ROW_NUMBER partitionerad per kund och sorterad efter datum i fallande ordning.

Lägg till en skiljande sorteringsnyckel (order-id) så att resultatet blir deterministiskt när två order har samma datum. Detaljen brukar starka kandidater ta med.

SELECT customer_id, id AS order_id, order_date, amount
FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (
           PARTITION BY customer_id
           ORDER BY order_date DESC, id DESC
         ) AS rn
  FROM orders o
) t
WHERE rn = 1;

Problem 5: Tillväxt månad för månad

"Beräkna månatliga intäkter från betalda order och den procentuella förändringen jämfört med föregående månad." Detta kombinerar aggregering i en CTE med LAG.

Steg ett aggregerar per månad; steg två jämför varje månad med föregående månad med hjälp av LAG. Skydda divisionen så att den första månaden (som saknar föregående månad) inte orsakar ett fel.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  WHERE status = 'paid'
  GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
       revenue,
       LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
       ROUND(
         100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
         / NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
       ) AS pct_change
FROM monthly
ORDER BY mth;

Problem 6: Bästa produkten per kategori

"Returnera den bästsäljande produkten i varje kategori, baserat på totalt antal sålda enheter." Mönstret för topp-N per grupp: aggregera, rangordna inom partitionen och filtrera fram rang 1.

Om lika resultat är viktiga, byt ut ROW_NUMBER mot RANK så att alla produkter på förstaplats visas. Att nämna det valet visar att ni förstår skillnaden.

WITH sales AS (
  SELECT p.category,
         p.name AS product,
         SUM(oi.quantity) AS qty
  FROM order_items oi
  JOIN products p ON p.id = oi.product_id
  GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
  SELECT s.*,
         ROW_NUMBER() OVER (
           PARTITION BY category ORDER BY qty DESC
         ) AS rn
  FROM sales s
) r
WHERE rn = 1;

Problem 7: Löpande intäktssumma

"Visa en löpande total av intäkterna från betalda order per dag." En fönsterbaserad SUM med en ordnad ram beräknar den löpande totalen utan en self-join.

Nämn ramtypen ROWS för en verkligt rad-för-rad-ackumulering; standardramen RANGE kan ge oväntade resultat när datum är lika.

SELECT order_date,
       SUM(daily) OVER (
         ORDER BY order_date
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS running_total
FROM (
  SELECT order_date, SUM(amount) AS daily
  FROM orders
  WHERE status = 'paid'
  GROUP BY order_date
) d
ORDER BY order_date;

Problem 8: Sammanhängande aktiva dagar

"Hitta användare som har minst tre sammanhängande dagar med en betald order." Det här är en variant av gaps-and-islands som använder tricket med skillnaden mellan radnummer.

Genom att subtrahera ett radnummer per användare från datumet får ni en konstant inom varje sammanhängande följd. Gruppera efter konstanten och räkna. Det här signalerar senior kompetens.

WITH days AS (
  SELECT DISTINCT customer_id, order_date
  FROM orders WHERE status = 'paid'
),
grp AS (
  SELECT customer_id, order_date,
         order_date - (ROW_NUMBER() OVER (
           PARTITION BY customer_id ORDER BY order_date
         ) * INTERVAL '1 day') AS island
  FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;

Prestanda och vanliga fallgropar

Efter en korrekt fråga frågar intervjuare ofta "hur skulle ni göra den snabbare?" och ser efter klassiska fallgropar. Ha en checklista redo:

  • Indexera kolumnerna som används för joins och filtrering (till exempel orders(customer_id, status)); undvik funktioner på indexerade kolumner i WHERE.
  • Föredra EXISTS framför IN för stora anti-joins; NOT IN med ett NULL-värde returnerar tyst ingenting.
  • Om ni filtrerar en kolumn från en outer join i WHERE blir joinen i praktiken tyst en inner join.
  • Lägg alltid till en skiljande sorteringsnyckel så att topp-N-resultat blir deterministiska.
  • Kontrollera EXPLAIN-planen efter sekventiella genomsökningar av stora tabeller.

Snabb kontroll

Ni behöver varje kunds enda senaste order, och två order kan ha samma datum.

Återblick: komplett uppsättning simulerade intervjuproblem

Ni har arbetat igenom de vanligaste intervjuproblemen från början till slut:

  • Aggregering + LIMIT för topp-N baserat på utgifter.
  • Anti-joins med NOT EXISTS (NULL-säkert).
  • DENSE_RANK för det N:e högsta värdet, ROW_NUMBER för senaste per nyckel och bästa per grupp.
  • LAG för månad-för-månad-förändring, SUM OVER för löpande totaler.
  • Tricket med gaps-and-islands och radnummer för sammanhängande följder.
  • Avsluta varje svar med att diskutera index, EXPLAIN och vanliga fallgropar.
Gratis att börja

Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
90
Lektioner
360

Vanliga frågor

Är lektionen ”Komplett uppsättning övningsintervjuer” gratis?

Ja – hela texten till ”Komplett uppsättning övningsintervjuer” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Vad lär jag mig i ”Komplett uppsättning övningsintervjuer”?

Tidsbegränsade problem från början till slut som kombinerar joiner, fönsterfunktioner och CTE:er under intervjuliknande förhållanden. Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?

Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Komplett uppsättning övningsintervjuer”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?

Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Normalisering till 3NF
  2. ER-modellering och relationskardinalitet
  3. Stjärnschema och design av datalager
  4. Komplett uppsättning övningsintervjuer
← Tillbaka till Förberedelse inför kodningsintervjuer