Проблем:
Искате да групирате данните си по години.
Пример I:
Една от колоните във вашите данни е transaction_date . Съдържа дата. Искате да групирате всичките си данни по години и да изчислите общите пари, спечелени всяка година.
data таблицата изглежда така:
| transaction_date | пари |
|---|---|
| 25-03-2018 | 1700 |
| 12.09.2019 | 100 |
| 14.07.2018 | 1200 |
| 2018-01-05 | 400 |
| 2019-06-08 | 2000 |
| 2020-03-06 | 1500 |
Решение 1 (показване на годината и спечелените пари):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Резултатът е:
| година | печелени_пари |
|---|---|
| 2020 | 1500 |
| 2019 | 2100 |
| 2018 | 3300 |
Решение 2 (показване на пълната дата, годината и парите, спечелени през съответната година):
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;
Резултатът е:
| transaction_date | година | печелени_пари |
|---|---|---|
| 25-03-2018 | 2018 | 3300 |
| 14.07.2018 | 2018 | 3300 |
| 2018-01-05 | 2018 | 3300 |
| 12.09.2019 | 2019 | 2100 |
| 2019-06-08 | 2019 | 2100 |
| 2020-03-06 | 2020 | 1500 |
Дискусия:
В този пример се приема, че нямате year колона. Вместо това имате колоната с пълни дати.
Първо, трябва да извлечете година от датата. Можете да използвате EXTRACT(part FROM date) функция, за да го направите. Във вашия случай искате да извлечете годината, така че part е year . date е колоната, която съдържа датите – transaction_date колона. Добра идея е колоната да се преименува на година след това. Ако искате да научите повече за EXTRACT функция и как да извлечете различни части от датата, можете да я намерите тук.
Ако искате да покажете само годината и общите пари, спечелени през тази година, можете да използвате GROUP BY . Първата избрана колона е годината, извлечена от датата. Втората колона е агрегатната функция SUM(money) . В края на заявката се нуждаете от GROUP BY EXTRACT(year FROM transaction_date) или, по-просто, GROUP BY 1 (since EXTRACT(year FROM transaction_date) е първата колона.)
Ако искате да покажете повече колони, имате нужда от функция на прозорец (Решение 2). След SUM(money) пишете OVER() клауза и тъй като искате да изчислите сумата за всяка година, използвайте PARTITION BY EXTRACT(year FROM transaction_date) вътре в него. Имайте предвид, че все още нямате колоната за годината, когато изчислявате сумата, така че PARTITION BY year няма да работи – ще получите грешка 'column "year" does not exist' . Можете да прочетете повече за функциите на прозореца в тази статия.
Пример II:
Една от колоните във вашите данни е year . Искате да групирате всичките си данни по тази колона и да изчислите общите спечелени пари всяка година.
data таблицата изглежда така:
| година | месец | ден | пари |
|---|---|---|---|
| 2018 | 3 | 25 | 1700 |
| 2019 | 9 | 12 | 100 |
| 2018 | 7 | 14 | 1200 |
| 2018 | 1 | 5 | 400 |
| 2019 | 6 | 8 | 2000 |
| 2020 | 3 | 6 | 1500 |
Решение 1 (показване на годината и спечелените пари):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Резултатът е:
| година | печелени_пари |
|---|---|
| 2020 | 1500 |
| 2018 | 3300 |
| 2019 | 2100 |
Решение 2 (показва година, месец, ден и парите, спечелени през съответната година):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Резултатът е:
| година | месец | ден | печелени_пари |
|---|---|---|---|
| 2018 | 3 | 25 | 3300 |
| 2018 | 7 | 14 | 3300 |
| 2018 | 1 | 5 | 3300 |
| 2019 | 9 | 12 | 2100 |
| 2019 | 6 | 8 | 2100 |
| 2020 | 3 | 6 | 1500 |
Дискусия:
В този пример се предполага, че вече имате year колона.
Ако искате да покажете годината и общите пари, спечелени през тази година, просто GROUP BY е достатъчно. Ако не се чувствате комфортно с концепцията за GROUP BY , вижте тук, където го обясняваме. Вие просто използвате агрегатната функция (тук:SUM ) с правилната колона и в края на заявката групирате по year . Можете да преименувате колоната с помощта на AS ключова дума с ново име.
По-сложно е, ако искате да покажете и някои други колони. След това се нуждаете от решението с помощта на функция прозорец (Решение 2). Трябва да използвате агрегатната функция със съответната колона (тук:SUM(money) ) и напишете OVER() клауза след това. В тази клауза трябва да използвате PARTITION BY с колоната, по която искате да групирате. Така получавате:
SUM(money) OVER(PARTITION BY year)
В това решение не използвате GROUP BY клауза.
Можете да прочетете повече за функциите на прозореца тук.