Проблем:
Искате да групирате данните си по години.
Пример 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
клауза.
Можете да прочетете повече за функциите на прозореца тук.