SQL Academy · Lektion

Optælling af entydige værdier

COUNT(DISTINCT ...) i praksis.

Lektion 4 af 413 trin

Optælling af entydige værdier er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 4 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 SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvorfor tælle unikke værdier?

Når du bruger COUNT(*), tæller du alle rækker — også dubletter. Men nogle gange vil du kun vide, hvor mange forskellige værdier der findes i en kolonne.

For eksempel: Hvor mange forskellige lande kommer dine kunder fra? Hvor mange unikke produkter blev bestilt sidste måned? Det er her, COUNT(DISTINCT ...) kommer ind i billedet.

Oprettelse af en eksempeltabel

Lad os oprette en tabel med navnet orders, som vi kan øve os med. Hver ordre har et kundenavn, et produkt og et land.

Bemærk, at nogle kunder og lande forekommer mere end én gang — det er med vilje, så vi kan se forskellen mellem at tælle alle rækker og at tælle unikke værdier.

CREATE TABLE orders (
  id INT,
  customer VARCHAR(50),
  product VARCHAR(50),
  country VARCHAR(50)
);

INSERT INTO orders VALUES
  (1, 'Alice', 'Laptop', 'USA'),
  (2, 'Bob', 'Phone', 'UK'),
  (3, 'Alice', 'Tablet', 'USA'),
  (4, 'Carol', 'Laptop', 'Canada'),
  (5, 'Bob', 'Laptop', 'UK'),
  (6, 'Dave', 'Phone', 'USA'),
  (7, 'Carol', 'Phone', 'Canada'),
  (8, 'Eve', 'Tablet', 'Germany');

COUNT(*) sammenlignet med COUNT(DISTINCT)

Kør begge forespørgsler, og sammenlign resultaterne. COUNT(*) returnerer 8 — én for hver række. COUNT(DISTINCT customer) returnerer 5 — fordi der kun er 5 unikke kunder (Alice, Bob, Carol, Dave og Eve).

Det er grundideen: COUNT(DISTINCT column) ignorerer gentagne værdier og tæller kun unikke værdier.

SELECT COUNT(*) AS total_orders,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders;

Optælling af unikke lande

Lad os finde ud af, hvor mange forskellige lande vores kunder kommer fra. Selvom tabellen orders har 8 rækker, har flere rækker det samme land.

Resultatet bliver 4 — USA, Storbritannien, Canada og Tyskland — uanset hvor mange gange hvert land forekommer.

SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;

Optælling af unikke produkter

Vi kan bruge det samme mønster på alle kolonner. Her tæller vi, hvor mange forskellige produkter der er blevet bestilt.

Selvom Laptop forekommer tre gange, og Phone forekommer tre gange, tælles hvert produkt kun én gang. Resultatet er 3: Laptop, Phone og Tablet.

SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;

Brug af COUNT(DISTINCT) med WHERE

Du kan kombinere COUNT(DISTINCT ...) med en WHERE-klausul for at begrænse antallet af rækker, før du tæller. Her tæller vi unikke produkter, der kun er bestilt af kunder fra USA.

Kun rækker, hvor country = 'USA', tages i betragtning, og derefter tæller vi de unikke produkter blandt disse rækker.

SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';

COUNT(DISTINCT) med GROUP BY

Når GROUP BY kombineres med COUNT(DISTINCT ...), får du unikke optællinger pr. gruppe. Denne forespørgsel besvarer spørgsmålet: Hvor mange unikke kunder afgav ordrer i hvert land?

Hver gruppe behandles uafhængigt, så dubletter i en gruppe fjernes før optællingen.

SELECT country,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;

Optælling af unikke værdier i flere kolonner

Du kan bruge flere COUNT(DISTINCT ...)-udtryk i samme SELECT. Det giver dig et hurtigt overblik over kardinaliteten — hvor mange unikke værdier hver kolonne indeholder — i én enkelt forespørgsel.

Kardinalitet er et nyttigt mål, når du udforsker et nyt datasæt.

SELECT COUNT(DISTINCT customer) AS unique_customers,
       COUNT(DISTINCT product)  AS unique_products,
       COUNT(DISTINCT country)  AS unique_countries
FROM orders;

Sådan behandles NULL

Ligesom almindelig COUNT(column) COUNT(DISTINCT column) ignorerer NULL-værdier. En NULL tælles ikke som en unik værdi.

I dette eksempel har to rækker NULL i kolonnen country. Resultatet er stadig 4 unikke lande, der ikke er NULL, og ikke 5.

INSERT INTO orders VALUES
  (9,  'Frank', 'Phone',  NULL),
  (10, 'Grace', 'Laptop', NULL);

SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;

Sammenligning af COUNT(*), COUNT(col) og COUNT(DISTINCT col)

Det er nyttigt at se alle tre COUNT-former side om side:

  • COUNT(*) — tæller alle rækker, inklusive NULL-værdier
  • COUNT(country) — tæller rækker, hvor country ikke er NULL
  • COUNT(DISTINCT country) — tæller unikke værdier i country, der ikke er NULL

Kør dette på den opdaterede tabel (nu 10 rækker, hvoraf 2 har NULL i country) for at bekræfte forskellene.

SELECT COUNT(*)                AS total_rows,
       COUNT(country)          AS non_null_countries,
       COUNT(DISTINCT country) AS unique_countries
FROM orders;

Praktisk anvendelse: Dagligt aktive brugere

En af de mest almindelige anvendelser af COUNT(DISTINCT ...) inden for analyse er at tælle dagligt aktive brugere (DAU). Du har en hændelseslog og vil vide, hvor mange unikke brugere der var aktive hver dag.

Gruppér efter datoen med GROUP BY, og brug COUNT(DISTINCT user_id) for at få en optælling af unikke brugere pr. dag — dubletter fra den samme bruger, der klikker flere gange, udelukkes automatisk.

CREATE TABLE user_events (
  event_date DATE,
  user_id    INT
);

INSERT INTO user_events VALUES
  ('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
  ('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
  ('2024-01-03', 1), ('2024-01-03', 4);

SELECT event_date,
       COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;

Hurtigt tjek

Tjek din forståelse af COUNT(DISTINCT ...) med dette spørgsmål.

Opsummering af lektionen

Godt klaret! Her er en opsummering af, hvad du har lært om COUNT(DISTINCT ...):

  • COUNT(DISTINCT column) tæller kun unikke værdier, der ikke er NULL, i en kolonne.
  • Den adskiller sig fra COUNT(*) (alle rækker) og COUNT(column) (rækker, der ikke er NULL).
  • Den fungerer sammen med WHERE for at filtrere rækker før optællingen.
  • Den fungerer sammen med GROUP BY for at tælle unikke værdier pr. gruppe.
  • NULL-værdier udelades altid fra den unikke optælling.
  • Flere COUNT(DISTINCT ...)-udtryk kan indgå i samme SELECT.
  • Almindelige praktiske anvendelser omfatter optælling af unikke brugere, produkter, lande og sessioner.

Når du mestrer denne funktion, får du et effektivt værktøj til udforskning af data og analyse.

Gratis at komme i gang

Lær SQL 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
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Optælling af entydige værdier” gratis?

Ja — hele teksten til “Optælling af entydige værdier” 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 SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Optælling af entydige værdier”?

COUNT(DISTINCT ...) i praksis. Du øver dig i SQL Academy 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å SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy 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 4 af 4.

Hvor lang tid tager lektionen “Optælling af entydige værdier”?

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 SQL Academy-lektion?

Ja. Alle SQL Academy-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. Grundlæggende SELECT DISTINCT
  2. DISTINCT på flere kolonner
  3. PostgreSQL DISTINCT ON
  4. Optælling af entydige værdier
← Tilbage til SQL Academy