PostgreSQL обратное пересечение и соединение - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть форма опроса определенных вопросов для определенного учреждения.объект может контролироваться (ввод данных) более одного раза в месяц.теперь мне нужны последние данные (значения) по вопросам, но если по любому вопросу нет последних данных, я переберу предыдущие записи (предыдущие даты) того же месяца.

я могу получить последнюю запись, ноя не знаю, как получить предыдущую запись за тот же месяц. id нет последних данных.

Я использую PostgreSQL 10.

Структура таблицы:

enter image description here

Желаемый выход -

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

demo: db <> fiddle

SELECT DISTINCT
    to_char(qdate, 'MON'),
    facility,
    idquestion,
    first_value(value) OVER (PARTITION BY facility, idquestion ORDER BY qdate DESC) as value
FROM questions
ORDER BY facility, idquestion

Использование оконных функций :

  1. first_value(value) OVER ... дает вам первоезначение оконной рамы.Кадр представляет собой группу facility и idquestion.Внутри этой группы строки упорядочены по дате DESC.Таким образом, самое последнее значение является первым, независимо от того, какая дата
  2. DISTINCT отфильтровала связанные значения (например, есть два значения для facility == 1 и idquestion == 7)

Обратите внимание:

«дата» - это зарезервированное слово в Postgres.Я настоятельно рекомендую переименовать вашу колонку, чтобы избежать определенных проблем.Кроме того, в Postgres строчные буквы используются и рекомендуется.

0 голосов
/ 04 декабря 2018

Вы можете попытаться использовать оконную функцию ROW_NUMBER, чтобы сделать это.

SELECT to_char(date, 'MON') month, 
       facility,
       idquestion,
       value
FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY facility,idquestion ORDER BY DATE DESC) rn
    FROM T
) t1
where rn = 1
...