Получение процентного изменения между выбранными данными в столбце в PostgreSQL

Я использую PostgreSQL и пытаюсь рассчитать процентное изменение для двух значений в одном столбце и сгруппировать их по столбцу имени, и у меня возникают проблемы.

Предположим, у меня есть следующая таблица:

названиеденьсчет
Аллен187
Аллен289
Аллен395
Боб164
Боб268
Боб375
Карл171
Карл277
Карл380

Я хочу, чтобы результатом было имя и процентное изменение для каждого человека между днем ​​​​3 и днем ​​​​1. Таким образом, Аллену будет 9,2, потому что с 87 до 95 это увеличение на 9,2 процента.

Я хочу, чтобы результат был:

названиепроцент_изменения
Аллен9.2
Боб17.2
Карл12,7

Спасибо за вашу помощь.

🤔 А знаете ли вы, что...
PostgreSQL поддерживает хранимые процедуры и функции, написанные на языках, таких как PL/pgSQL.


16
2

Ответы:

Вы можете попробовать функцию задержки, например:

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. Вероятно, есть более эффективные и причудливые решения, но это работает.