DISTINCT kontra GROUP BY för unikhet
När DISTINCT är rätt svar och när en intervjuare i stället förväntar sig GROUP BY
DISTINCT kontra GROUP BY för unikhet är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 3 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.
Vad DISTINCT gör
DISTINCT tar bort duplicerade rader. Det viktiga som intervjuare kontrollerar är att det gäller hela den valda raden, inte en enda kolumn – SELECT DISTINCT a, b tar alltså bort dubbletter utifrån paret (a, b).
SELECT DISTINCT department
FROM employees;DISTINCT omfattar alla valda kolumner
Med flera kolumner behåller DISTINCT varje unik kombination – en rad per unikt (department, job_title)-par. Det finns inget standardsätt att ta bort dubbletter från endast en kolumn.
SELECT DISTINCT department, job_title
FROM employees;Vad GROUP BY gör
GROUP BY slår ihop rader som har samma nyckel till en rad per grupp. Att gruppera efter en kolumn ger i sig samma resultat som DISTINCT på den kolumnen.
SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;Den verkliga skillnaden: aggregering
När skiljer de sig åt? När ett aggregat behövs. GROUP BY kan beräkna COUNT, SUM eller AVG per grupp; DISTINCT kan inte det. Behövs unika rader? DISTINCT. Behövs ett mått per grupp? GROUP BY.
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;DISTINCT kan inte räkna per grupp
Det går inte att lägga till räkning ovanpå DISTINCT. För frågan ”hur många anställda finns per avdelning?” är rätt verktyg alltid GROUP BY med COUNT(*) – inte 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) kombinerar båda idéerna
En användbar kombination: COUNT(DISTINCT col) räknar unika värden inom varje grupp. Här ligger DISTINCT inuti aggregatet och besvarar frågan ”hur många unika titlar finns per avdelning?”
SELECT department,
COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;Räkna unika värden totalt
Utan GROUP BY räknar COUNT(DISTINCT col) unika värden i hela tabellen – ett tydligt svar på frågan ”hur många olika avdelningar 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;Prestandan är ofta likvärdig
Är DISTINCT eller GROUP BY snabbast? Vid vanlig borttagning av dubbletter är de oftast likvärdiga – optimerare planerar dem på liknande sätt. Välj utifrån avsikten: DISTINCT för unika rader, GROUP BY vid aggregering.
DISTINCT och NULL
Hur behandlar DISTINCT NULL? Alla NULL-värden räknas som lika, så många NULL-rader slås ihop till en. GROUP BY gör likadant – NULL-värden bildar en enda grupp.
-- 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 icke-standardiserade konstruktionen DISTINCT ON (expr), som behåller den första raden per nyckel enligt en ORDER BY. Portabel kod använder i stället 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 gäller för hela SELECT, inte en kolumn
En sista fallgrop: DISTINCT gäller för hela raden, så SELECT DISTINCT customer_id, order_date ger inte en rad per kund. Använd GROUP BY med MAX eller en fönsterfunktion för det.
-- 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;Snabb kontroll
Välj rätt verktyg.
Sammanfattning
Sammanfattning: DISTINCT tar bort dubbletter från hela rader; GROUP BY slår ihop rader efter nyckel och möjliggör aggregat. COUNT(DISTINCT col) räknar unika värden, båda behandlar NULL som ett enda värde och prestandan är oftast likvärdig.
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 ”DISTINCT kontra GROUP BY för unikhet” gratis?
Ja – hela texten till ”DISTINCT kontra GROUP BY för unikhet” 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 ”DISTINCT kontra GROUP BY för unikhet”?
När DISTINCT är rätt svar och när en intervjuare i stället förväntar sig GROUP BY 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 3 av 4.
Hur lång tid tar lektionen ”DISTINCT kontra GROUP BY för unikhet”?
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
- Projicera kolumner och fallgropar med alias
- Beräknade kolumner och uttryckens prioritet
- DISTINCT kontra GROUP BY för unikhet
- CASE-uttryck i SELECT