Forberedelse til SQL-intervju · leksjon

DISTINCT versus GROUP BY for unikhet

Når DISTINCT er riktig svar, og når intervjueren i stedet forventer GROUP BY.

Leksjon 3 av 413 trinn

DISTINCT versus GROUP BY for unikhet er en gratis leksjon i Forberedelse til SQL-intervju på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til SQL-intervju, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva DISTINCT gjør

DISTINCT fjerner duplikatrader. Det viktigste intervjuere sjekker, er at det virker på hele raden som velges, ikke på én kolonne – derfor fjerner SELECT DISTINCT a, b duplikater av paret (a, b).

SELECT DISTINCT department
FROM employees;

DISTINCT omfatter alle valgte kolonner

Med flere kolonner beholder DISTINCT hver unike kombinasjon – én rad per forskjellig (department, job_title)-par. Det finnes ingen standardmetode for å fjerne duplikater fra bare én kolonne.

SELECT DISTINCT department, job_title
FROM employees;

Hva GROUP BY gjør

GROUP BY slår sammen rader med samme nøkkel til én rad per gruppe. Når du grupperer etter én kolonne uten noe mer, får du samme resultat som med DISTINCT på den kolonnen.

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

Den egentlige forskjellen: aggregering

Når er de forskjellige? Når du trenger en aggregatfunksjon. GROUP BY kan beregne COUNT, SUM eller AVG per gruppe, mens DISTINCT ikke kan det. Trenger du unike rader? DISTINCT. Trenger du et mål per gruppe? GROUP BY.

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

DISTINCT kan ikke telle per gruppe

Du kan ikke legge telling oppå DISTINCT. For «hvor mange ansatte er det per avdeling?» er riktig verktøy alltid GROUP BY med COUNT(*) – ikke SELECT DISTINCT.

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

COUNT(DISTINCT) kombinerer begge ideene

En nyttig kombinasjon er COUNT(DISTINCT col), som teller unike verdier innenfor hver gruppe. Her ligger DISTINCT inne i aggregatfunksjonen og svarer på «hvor mange ulike stillingstitler finnes per avdeling?»

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

Telle unike verdier totalt

Uten GROUP BY teller COUNT(DISTINCT col) unike verdier i hele tabellen – et enkelt svar på «hvor mange forskjellige avdelinger har vi?»

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

Ytelsesforskjellen er ofte liten

Er DISTINCT eller GROUP BY raskest? Ved enkel fjerning av duplikater er de vanligvis likeverdige – optimalisatorene lager omtrent samme plan. Velg etter hensikten: DISTINCT for unike rader, GROUP BY når du aggregerer.

DISTINCT og NULL

Hvordan behandler DISTINCT NULL? Alle NULL-verdier regnes som like, så mange rader med NULL slås sammen til én. GROUP BY gjør det samme – NULL-verdier danner én enkelt gruppe.

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

Postgres DISTINCT ON (bonus)

Bonus: Postgres har den ikke-standardiserte konstruksjonen DISTINCT ON (expr), som beholder den første raden per nøkkel basert på en ORDER BY. Portabel kode bruker i stedet ROW_NUMBER().

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

DISTINCT gjelder hele SELECT, ikke én kolonne

En annen fallgruve: DISTINCT virker på hele raden, så SELECT DISTINCT customer_id, order_date gir ikke én rad per kunde. Til det kan du bruke GROUP BY med MAX eller en vindusfunksjon.

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

Sjekk deg selv

Velg riktig verktøy.

Oppsummering

Oppsummering: DISTINCT fjerner duplikater fra hele rader, mens GROUP BY slår sammen rader etter nøkkel og muliggjør aggregatfunksjoner. COUNT(DISTINCT col) teller unike verdier, begge behandler NULL som én verdi, og ytelsesforskjellen er vanligvis liten.

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «DISTINCT versus GROUP BY for unikhet» gratis?

Ja – hele teksten i «DISTINCT versus GROUP BY for unikhet» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til SQL-intervju-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva lærer jeg i «DISTINCT versus GROUP BY for unikhet»?

Når DISTINCT er riktig svar, og når intervjueren i stedet forventer GROUP BY. Du øver på Forberedelse til SQL-intervju med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til SQL-intervju?

Ingen tidligere erfaring er nødvendig. Forberedelse til SQL-intervju på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «DISTINCT versus GROUP BY for unikhet»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til SQL-intervju-leksjonen?

Ja. Alle Forberedelse til SQL-intervju-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Projisere kolonner og fallgruver med aliaser
  2. Beregnede kolonner og operatorpresedens
  3. DISTINCT versus GROUP BY for unikhet
  4. CASE-uttrykk i SELECT
← Tilbake til Forberedelse til SQL-intervju