Problem:
Chcesz pogrupować swoje dane według roku.
Przykład I:
Jedna z kolumn w Twoich danych to transaction_date . Zawiera datę. Chcesz pogrupować wszystkie swoje dane według roku i obliczyć łączne pieniądze zarobione każdego roku.
date tabela wygląda tak:
| data_transakcji | pieniądze |
|---|---|
| 2018-03-25 | 1700 |
| 2019-09-12 | 100 |
| 14-07-2018 | 1200 |
| 2018-01-05 | 400 |
| 2019-06-08 | 2000 |
| 2020-03-06 | 1500 |
Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Wynik:
| rok | pieniądze_zarobione |
|---|---|
| 2020 | 1500 |
| 2019 | 2100 |
| 2018 | 3300 |
Rozwiązanie 2 (wyświetlanie pełnej daty, roku i pieniędzy zarobionych w odpowiednim roku):
SELECT transaction_date AS transaction_date, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned FROM data;
Wynik:
| data_transakcji | rok | pieniądze_zarobione |
|---|---|---|
| 2018-03-25 | 2018 | 3300 |
| 14-07-2018 | 2018 | 3300 |
| 2018-01-05 | 2018 | 3300 |
| 2019-09-12 | 2019 | 2100 |
| 2019-06-08 | 2019 | 2100 |
| 2020-03-06 | 2020 | 1500 |
Dyskusja:
W tym przykładzie założono, że nie masz year kolumna. Zamiast tego masz kolumnę z pełnymi datami.
Najpierw musisz pobrać rok od daty. Możesz użyć EXTRACT(part FROM date) funkcja to zrobić. W twoim przypadku chcesz wyodrębnić rok, więc part to year . date to kolumna zawierająca daty – transaction_date kolumna. Dobrym pomysłem jest zmiana nazwy kolumny na rok później. Jeśli chcesz dowiedzieć się więcej o EXTRACT funkcji i jak pobrać różne części z daty, znajdziesz to tutaj.
Jeśli chcesz wyświetlić tylko rok i łączne pieniądze zarobione w tym roku, możesz użyć GROUP BY . Pierwsza wybrana kolumna to rok wyodrębniony z daty. Druga kolumna to funkcja agregująca SUM(money) . Na końcu zapytania potrzebujesz GROUP BY EXTRACT(year FROM transaction_date) lub prościej, GROUP BY 1 (since EXTRACT(year FROM transaction_date) to pierwsza kolumna.)
Jeśli chcesz wyświetlić więcej kolumn, potrzebujesz funkcji okna (Rozwiązanie 2). Po SUM(money) piszesz OVER() klauzuli, a ponieważ chcesz obliczyć sumę za każdy rok, użyj PARTITION BY EXTRACT(year FROM transaction_date) w środku tego. Pamiętaj, że nie masz jeszcze kolumny roku podczas obliczania sumy, więc PARTITION BY year nie zadziała – pojawi się błąd 'column "year" does not exist' . Możesz przeczytać więcej o funkcjach okien w tym artykule.
Przykład II:
Jedna z kolumn w Twoich danych to year . Chcesz pogrupować wszystkie swoje dane według tej kolumny i obliczyć łączną sumę pieniędzy zarobionych każdego roku.
date tabela wygląda tak:
| rok | miesiąc | dzień | pieniądze |
|---|---|---|---|
| 2018 | 3 | 25 | 1700 |
| 2019 | 9 | 12 | 100 |
| 2018 | 7 | 14 | 1200 |
| 2018 | 1 | 5 | 400 |
| 2019 | 6 | 8 | 2000 |
| 2020 | 3 | 6 | 1500 |
Rozwiązanie 1 (wyświetlanie roku i zarobionych pieniędzy):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Wynik:
| rok | pieniądze_zarobione |
|---|---|
| 2020 | 1500 |
| 2018 | 3300 |
| 2019 | 2100 |
Rozwiązanie 2 (wyświetlanie roku, miesiąca, dnia i pieniędzy zarobionych w odpowiednim roku):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Wynik:
| rok | miesiąc | dzień | pieniądze_zarobione |
|---|---|---|---|
| 2018 | 3 | 25 | 3300 |
| 2018 | 7 | 14 | 3300 |
| 2018 | 1 | 5 | 3300 |
| 2019 | 9 | 12 | 2100 |
| 2019 | 6 | 8 | 2100 |
| 2020 | 3 | 6 | 1500 |
Dyskusja:
W tym przykładzie założono, że masz już year kolumna.
Jeśli chcesz wyświetlić rok i łączne pieniądze zarobione w tym roku, proste GROUP BY wystarczy. Jeśli nie czujesz się komfortowo z koncepcją GROUP BY , spójrz tutaj, gdzie to wyjaśniamy. Wystarczy użyć funkcji agregującej (tutaj:SUM ) z poprawną kolumną i na końcu zapytania grupujesz według year . Możesz zmienić nazwę kolumny za pomocą AS słowo kluczowe z nową nazwą.
Sprawa jest bardziej skomplikowana, jeśli chcesz wyświetlić także inne kolumny. Wtedy potrzebujesz rozwiązania wykorzystującego funkcję okna (Rozwiązanie 2). Powinieneś użyć funkcji agregującej z odpowiednią kolumną (tutaj:SUM(money) ) i napisz OVER() klauzuli później. W tej klauzuli powinieneś użyć PARTITION BY z kolumną, według której chcesz pogrupować. W ten sposób otrzymujesz:
SUM(money) OVER(PARTITION BY year)
W tym rozwiązaniu nie używasz GROUP BY klauzula.
Możesz przeczytać więcej o funkcjach okien tutaj.