Forberedelse til kodeinterviews · Lektion

Gennemgang af et organisationsdiagram

Følg et medarbejder-leder-hierarki til enhver dybde

Lektion 2 af 413 trin

Gennemgang af et organisationsdiagram er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Spørgsmålet om organisationsdiagrammet

"Givet en employees-tabel med id, name og manager_id, vis alle under en given leder, uanset dybde." Dette er en af de mest almindelige opgaver om rekursive CTE'er til jobsamtaler.

Tabellen er selvrefererende: manager_id peger tilbage på en anden rækkes id. I denne lektion gennemløber du den både nedad (underordnede) og opad (ledelseskæden).

Eksempeltabellen

Forestil dig disse data. Den administrerende direktør har ingen leder (NULL). Alle andre refererer op gennem kæden.

  • 1 Ada (leder NULL)
  • 2 Ben (leder 1)
  • 3 Cleo (leder 1)
  • 4 Dan (leder 2)
  • 5 Eve (leder 4)

Så hierarkiet er: Ada → Ben → Dan → Eve. Husk det, mens vi gennemløber det.

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT REFERENCES employees(id)
);

Nedad fra en leder

Hvis du vil vise alle medarbejdere under en valgt leder, vælger ankermedlemmet den pågældende leder (eller dennes direkte underordnede), og det rekursive medlem følger manager_id ned gennem hierarkiet.

Her starter vi med Ben (id 2) og samler alle underordnede under ham.

WITH RECURSIVE subtree AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE id = 2
    UNION ALL
    SELECT e.id, e.name, e.manager_id, s.depth + 1
    FROM employees e
    JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;

Sådan læses resultatet

Forespørgslen ovenfor returnerer Ben med depth 1, Dan med depth 2 og Eve med depth 3. Ankermedlemmet startede med Ben; første iteration fandt Dan (hvis leder er Ben); anden iteration fandt Eve (hvis leder er Dan); tredje iteration fandt ingen, så rekursionen stoppede.

Hvis intervieweren spørger "Hvor mange niveauer under Ben sidder Eve?", besvarer kolonnen depth det direkte: 3 minus 1 er lig med 2 niveauer.

Opad til den administrerende direktør

Det omvendte spørgsmål er lige så almindeligt: "Vis Eves fulde ledelseskæde op til den administrerende direktør." Vend join-retningen — det rekursive medlem følger nu den aktuelle rækkes manager_id op til den overordnede.

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id, 1 AS lvl
    FROM employees WHERE id = 5
    UNION ALL
    SELECT e.id, e.name, e.manager_id, c.lvl + 1
    FROM employees e
    JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;

Nedad kontra opad: Joinet vendes

Den eneste strukturelle forskel mellem at gå nedad og opad er join-betingelsen:

  • Nedad (find underordnede): e.manager_id = cte.id — find medarbejdere, hvis leder er en række, vi allerede har.
  • Opad (find ledere): e.id = cte.manager_id — find den medarbejder, hvis id er lederen for vores aktuelle række.

Det imponerer interviewere, når du kan forklare denne vending klart.

Opbygning af et indrykket træ

Et gennemarbejdet svar formaterer resultatet som et indrykket træ ved at bruge depth til at gentage mellemrum. Det viser, at du kan præsentere hierarkiske resultater, ikke kun beregne dem.

WITH RECURSIVE org AS (
    SELECT id, name, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT('  ', depth - 1) || name AS tree
FROM org
ORDER BY depth;

Akkumulering af stien

Hvis du vil vise hele vejen fra den administrerende direktør til hver person, skal du føre en streng i path med. Det er den samme teknik som i den foregående lektion, anvendt på organisationsdiagrammet.

WITH RECURSIVE org AS (
    SELECT id, name, CAST(name AS VARCHAR(500)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.path || ' / ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;

Optælling af underordnede pr. leder

Et hyppigt opfølgende spørgsmål er: "Hvor mange personer refererer direkte eller indirekte til hver leder?" Brug det rekursive undertræ pr. leder, og aggreger derefter. Et almindeligt mønster er at køre rekursionen én gang pr. rod og bruge GROUP BY på den seedende leder.

Her tæller vi alle indirekte underordnede under Ada (den administrerende direktør) ved at gennemløbe hele træet og tælle rækker under roden.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 0 AS depth
    FROM employees WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;

Almindelige fejl

Vær opmærksom på disse faldgruber, som interviewere opstiller:

  • Forkert join-retning — hvis du bruger e.manager_id = cte.id, når du mente at gå opad, får du det forkerte sæt.
  • Glemt filter i ankermedlemmet — hvis du udelader WHERE id = X, starter du med hver række og returnerer hele skoven.
  • Dybde forskudt med én — afgør, om startrækken er niveau 0 eller 1, og vær konsekvent.

Hvorfor ikke bare bruge self-join?

En self-join kan hente et fast antal niveauer: ét join for direkte underordnede, to for medarbejdere to niveauer nede og så videre. Men du skal kende dybden på forhånd og skrive ét join pr. niveau.

En rekursiv CTE håndterer en vilkårlig, ukendt dybde i én forespørgsel. Når en interviewer siger "hierarkiet kan have et hvilket som helst antal niveauer", udelukker det almindelige self-joins og peger på rekursion.

Hurtigt tjek

Sørg for, at du kan vende gennemløbsretningen.

Opsummering

Gennemløb af et organisationsdiagram er det rekursive skelet anvendt på en selvrefererende tabel:

  • Ned: start med en leder, og forbind med e.manager_id = cte.id.
  • Op: start med en medarbejder, og forbind med e.id = cte.manager_id.
  • Medtag depth til indrykning og path til hele kæden.
  • Rekursion håndterer enhver ukendt dybde, hvilket en selvforbindelse ikke kan.

Næste: brug af rekursion til at generere tal- og datoserier.

Gratis at komme i gang

Lær Forberedelse til kodeinterviews med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “Gennemgang af et organisationsdiagram” gratis?

Ja — hele teksten til “Gennemgang af et organisationsdiagram” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Gennemgang af et organisationsdiagram”?

Følg et medarbejder-leder-hierarki til enhver dybde Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Gennemgang af et organisationsdiagram”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Anker- og rekursive medlemmer
  2. Gennemgang af et organisationsdiagram
  3. Generering af tal- og datoserier
  4. Undgåelse af uendelig rekursion
← Tilbage til Forberedelse til kodeinterviews