Запрос количества открытия и закрытия в postgresql - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь установить открывающий и закрывающий столбец в запросе postgresql, в котором я ввожу определенный диапазон дат, и столбец открытия моей первой строки должен быть до начальной даты, а закрытие должно быть (открытие столбца + столбец1 + столбец2 + столбец 3) в каждом строка с указанием даты.

*** Вот мой пример базы данных

Date         column1  column2 column3
01/01/2017   10       10      20
02/01/2017   10       10      20
03/01/2017   10       10      20
04/01/2017   10       10      20
05/01/2017   10       10      20
06/01/2017   10       10      20

* Мой ожидаемый запрос в postgresql * диапазон дат от 01.01.2017 до 01.01.2017

Date         opening  column1  column2  column3 closing
03/01/2017   60       10       20       10      100
04/01/2017   100      10       20       10      140     
05/01/2017   140      10       20       10      180
06/01/2017   180      10       20       10      220

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Это хороший простой пример того, для чего созданы оконные функции (https://www.postgresql.org/docs/current/static/tutorial-window.html):

демо: дБ <> скрипка

SELECT
    "date",
    closing - day_value as opening, 
    column1,
    column2,
    column3,
    closing
FROM (
    SELECT 
         *, 
         column1 + column2 + column3 as day_value,
         SUM(column1 + column2 + column3) OVER (ORDER BY "date") AS closing
    FROM testdata
) s

Функция окна SUM добавляет все значения строк до и включая текущую строку, если она упорядочена (если нет, то суммирует все строки).

Вам нужно выполнить оконную функцию со всем набором данных, прежде чем вы сможете отфильтровать даты

SELECT * FROM (
    -- <QUERY ABOVE>
) s
WHERE "date" BETWEEN '2017-01-03' AND '2017-01-06'
0 голосов
/ 16 сентября 2018

Вы можете использовать оконную сумму:

SELECT "date",col1,col2,col3, closing-col1-col2-col3 AS opening, closing
FROM (SELECT *, SUM(col1+col2+col3) OVER(ORDER BY "date") AS closing
      FROM tab) sub

дБ <> демонстрация скрипки


Чуть более краткая версия:

SELECT tab.*,SUM(s.x) OVER(ORDER BY "date")-s.x AS opening,
             SUM(s.x) OVER(ORDER BY "date") AS closing
FROM tab,LATERAL(SELECT col1+col2+col3) AS s(x)

дБ <> fiddle demo2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...