#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть table
с:
Company|Date | Value
Best Buy| 2018-06 | 100
Best Buy|2018-07 | 105
Best Buy|2017-06 | 90
Best Buy|2017-07 | 92
Я хочу рассчитать годовой прирост, чтобы получить что-то вроде:
Date | YoY growth
2018-06 | 0.11111
2018-07 | 0.1413
Когда я собираюсь объединить две таблицы следующим образом:
SELECT y1.company, y2.Date, (y2.value/y1.value -1) as YoY_growth
FROM table as y1
LEFT JOIN table as y2
ON y1.company = y2.company AND (y2.date = y1.date interval '1 year');
Как правильно в PSQL увеличить y1.date на 1 год, чтобы получить годовой прирост. В настоящее время таблица заполняется нулевыми значениями
Комментарии:
1. Какой тип данных
date
?2. @LaurenzAlbe to_Date(to_Char(дата, ‘ГГГГ-ММ’),’ГГГГ-ММ’)
3. Я имею в виду, это
date
,timestamp with time zone
timestamp without time zone
,text
a, …4. @LaurenzAlbe извините, это просто
date
5. Но
2018-06
это не возможное значение дляdate
. Что такое часть «день»? Возможно, ваша проблема заключается именно в этом.
Ответ №1:
Вы можете сделать:
SELECT y1.company, y2.Date, (y2.value/y1.value -1) as YoY_growth
FROM table y1 LEFT JOIN
table y2
ON y1.company = y2.company AND
(y2.date || '-01')::date = (y1.date || '-01')::date interval '1 year');
Ответ №2:
Предполагая, что вы действительно сохраняете свое поле даты как тип даты. Этого ответа было бы достаточно. В противном случае я сдаюсь, lol : D
DISTINCT ON (company, date_part('month', y1.date))
выбирает месяцы только для каждой компании. Таким образом, у вас есть максимум 12 строк только для каждой компании.
Живой тест:http://sqlfiddle.com /#!17/751ad/4
CREATE TABLE progress
("company" varchar(7), "date" date, "value" numeric(18,4))
;
INSERT INTO progress
("company", "date", "value")
VALUES
('BestBuy', '2017-06-01', 90),
('BestBuy', '2017-07-01', 92),
('BestBuy', '2018-06-01', 100),
('BestBuy', '2018-07-01', 105)
;
SELECT
distinct on (y1.company, date_part('month', y1.date))
y1.company,
to_char(
first_value(y1.date)
over (partition by y1.company, date_part('month', y1.date)
order by y1.date desc),
'YYYY-MM'
) as date,
(y1.value/y2.value - 1) as YoY_growth
FROM progress as y1
LEFT JOIN progress as y2
ON y1.company = y2.company AND (y2.date = y1.date - interval '1 year');
Вывод:
| company | date | yoy_growth |
|---------|---------|--------------------|
| BestBuy | 2018-06 | 0.1111111111111111 |
| BestBuy | 2018-07 | 0.141304347826087 |