Как увеличить таблицу PSQL на один год

#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 |