Zliczanie unikatowych wartości
Korzystaj z COUNT(DISTINCT ...) w praktyce
Zliczanie unikatowych wartości to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Po co zliczać unikalne wartości?
Użycie COUNT(*) zlicza każdy wiersz — również duplikaty. Czasami chcą Państwo jednak wiedzieć tylko, ile unikalnych wartości znajduje się w kolumnie.
Na przykład: z ilu różnych krajów pochodzą Państwa klienci? Ile unikalnych produktów zamówiono w zeszłym miesiącu? Właśnie w takich sytuacjach przydaje się COUNT(DISTINCT ...).
Przygotowanie przykładowej tabeli
Utwórzmy tabelę orders do ćwiczeń. Każde zamówienie zawiera nazwę klienta, produkt i kraj.
Proszę zauważyć, że niektórzy klienci i niektóre kraje pojawiają się więcej niż raz — jest to zamierzone, aby można było zobaczyć różnicę między zliczaniem wszystkich wierszy a zliczaniem unikalnych wartości.
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(*) a COUNT(DISTINCT)
Uruchommy oba zapytania i porównajmy wyniki. COUNT(*) zwraca 8 — po jednym wyniku dla każdego wiersza. COUNT(DISTINCT customer) zwraca 5 — ponieważ istnieje tylko 5 unikalnych klientów (Alice, Bob, Carol, Dave, Eve).
To podstawowa zasada: COUNT(DISTINCT column) pomija powtarzające się wartości i zlicza tylko unikalne.
SELECT COUNT(*) AS total_orders,
COUNT(DISTINCT customer) AS unique_customers
FROM orders;Zliczanie unikalnych krajów
Sprawdźmy, z ilu różnych krajów pochodzą nasi klienci. Mimo że tabela orders zawiera 8 wierszy, kilka wierszy ma ten sam kraj.
Wynik będzie równy 4 — USA, UK, Canada i Germany — niezależnie od tego, ile razy każdy z tych krajów występuje.
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;Zliczanie unikalnych produktów
Ten sam schemat można zastosować do dowolnej kolumny. Tutaj zliczamy, ile różnych produktów zostało zamówionych.
Mimo że produkt „Laptop” pojawia się trzy razy, a „Phone” trzy razy, każdy produkt jest liczony tylko raz. Odpowiedź to 3: Laptop, Phone, Tablet.
SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;Używanie COUNT(DISTINCT) z WHERE
Można połączyć COUNT(DISTINCT ...) z klauzulą WHERE, aby zawęzić wiersze przed zliczaniem. W tym przykładzie zliczamy unikalne produkty zamówione wyłącznie przez klientów z USA.
Uwzględniane są tylko wiersze, w których country = 'USA', a następnie wśród tych wierszy zliczane są unikalne produkty.
SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';COUNT(DISTINCT) z GROUP BY
W połączeniu z GROUP BY funkcja COUNT(DISTINCT ...) zwraca unikalne liczności dla poszczególnych grup. To zapytanie odpowiada na pytanie: ilu unikalnych klientów złożyło zamówienia w każdym kraju?
Każda grupa jest przetwarzana niezależnie, więc duplikaty w jej obrębie są usuwane przed zliczaniem.
SELECT country,
COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;Zliczanie unikalnych wartości w wielu kolumnach
W tym samym SELECT można użyć kilku wyrażeń COUNT(DISTINCT ...). Daje to szybki przegląd kardynalności — liczby unikalnych wartości przechowywanych w każdej kolumnie — w ramach jednego zapytania.
Kardynalność to przydatna miara podczas analizowania nowego zbioru danych.
SELECT COUNT(DISTINCT customer) AS unique_customers,
COUNT(DISTINCT product) AS unique_products,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Sposób traktowania NULL
Podobnie jak zwykła funkcja COUNT(column), COUNT(DISTINCT column) pomija wartości NULL. Wartość NULL nie jest liczona jako unikalna wartość.
W tym przykładzie dwa wiersze zawierają NULL w kolumnie country. Wynik nadal wynosi 4 unikalne wartości inne niż NULL, a nie 5.
INSERT INTO orders VALUES
(9, 'Frank', 'Phone', NULL),
(10, 'Grace', 'Laptop', NULL);
SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;Porównanie COUNT(*), COUNT(col) i COUNT(DISTINCT col)
Warto zobaczyć wszystkie trzy formy COUNT obok siebie:
- COUNT(*) — zlicza każdy wiersz, w tym wartości NULL
- COUNT(country) — zlicza wiersze, w których country nie jest NULL
- COUNT(DISTINCT country) — zlicza unikalne wartości country inne niż NULL
Uruchommy to zapytanie dla zaktualizowanej tabeli (obecnie 10 wierszy, z czego 2 mają NULL w kolumnie country), aby potwierdzić różnice.
SELECT COUNT(*) AS total_rows,
COUNT(country) AS non_null_countries,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Praktyczny przypadek użycia: dziennie aktywni użytkownicy
Jednym z najczęstszych zastosowań COUNT(DISTINCT ...) w analityce jest zliczanie dziennie aktywnych użytkowników (DAU). Mają Państwo dziennik zdarzeń i chcą wiedzieć, ilu unikalnych użytkowników było aktywnych każdego dnia.
Proszę użyć GROUP BY dla daty oraz COUNT(DISTINCT user_id), aby uzyskać liczbę unikalnych użytkowników dla każdego dnia — duplikaty wynikające z wielokrotnego klikania przez tego samego użytkownika zostaną automatycznie pominięte.
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;Szybkie sprawdzenie
Sprawdźmy, czy rozumieją Państwo działanie COUNT(DISTINCT ...), odpowiadając na to pytanie.
Podsumowanie lekcji
Świetna praca! Oto podsumowanie tego, czego nauczyli się Państwo o COUNT(DISTINCT ...):
COUNT(DISTINCT column)zlicza tylko unikalne wartości inne niż NULL w kolumnie.- Różni się od
COUNT(*)(wszystkie wiersze) iCOUNT(column)(wiersze inne niż NULL). - Działa z WHERE, aby filtrować wiersze przed zliczaniem.
- Działa z GROUP BY, aby zliczać unikalne wartości dla poszczególnych grup.
- Wartości NULL są zawsze wykluczane z unikalnego zliczania.
- W tym samym SELECT może występować wiele wyrażeń
COUNT(DISTINCT ...). - Typowe zastosowania praktyczne obejmują zliczanie unikalnych użytkowników, produktów, krajów i sesji.
Opanowanie tej funkcji daje Państwu potężne narzędzie do eksploracji danych i analityki.
Często zadawane pytania
Czy lekcja „Zliczanie unikatowych wartości” jest bezpłatna?
Tak — pełny tekst „Zliczanie unikatowych wartości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Zliczanie unikatowych wartości”?
Korzystaj z COUNT(DISTINCT ...) w praktyce Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Zliczanie unikatowych wartości”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy SELECT DISTINCT
- DISTINCT dla wielu kolumn
- PostgreSQL DISTINCT ON
- Zliczanie unikatowych wartości