Я использую PostgreSQL и пытаюсь рассчитать процентное изменение для двух значений в одном столбце и сгруппировать их по столбцу имени, и у меня возникают проблемы.
Предположим, у меня есть следующая таблица:
название | день | счет |
---|---|---|
Аллен | 1 | 87 |
Аллен | 2 | 89 |
Аллен | 3 | 95 |
Боб | 1 | 64 |
Боб | 2 | 68 |
Боб | 3 | 75 |
Карл | 1 | 71 |
Карл | 2 | 77 |
Карл | 3 | 80 |
Я хочу, чтобы результатом было имя и процентное изменение для каждого человека между днем 3 и днем 1. Таким образом, Аллену будет 9,2, потому что с 87 до 95 это увеличение на 9,2 процента.
Я хочу, чтобы результат был:
название | процент_изменения |
---|---|
Аллен | 9.2 |
Боб | 17.2 |
Карл | 12,7 |
Спасибо за вашу помощь.
🤔 А знаете ли вы, что...
PostgreSQL поддерживает хранимые процедуры и функции, написанные на языках, таких как PL/pgSQL.
Вы можете попробовать функцию задержки, например:
select name, day, score, 100*(score - lag(score, 1) over (partition by name order by day))/(lag(score, 1) over (partition by name order by day)) as growth_percentage
Попробуй это...
with dummy_table as (
select
name,
day,
score as first_day_score,
lag(score, 2) over (partition by name order by day desc) as last_day_score
from YOUR_TABLE_NAME
)
select
name,
(last_day_score - first_day_score) / first_day_score::decimal as percentage_change
from dummy_table where last_day_score is not null
Просто замените YOUR_TABLE_NAME. Вероятно, есть более эффективные и причудливые решения, но это работает.