Получение процентного изменения между выбранными данными в столбце в 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

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

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
16
2
Перейти к ответу Данный вопрос помечен как решенный

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

Спасибо psychpg2. Для всех, кто заинтересован, чтобы он отображался в процентах с 2 цифрами после запятой, я изменил предпоследнюю строку на: ROUND((last_day_score - first_day_score) / first_day_score::decimal * 100,2) как процент_изменения

FlyingZeppo 17.05.2022 23:41

Другие вопросы по теме