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.