PostgreSQL向后交集和合并

时间:2018-12-04 13:08:14

标签: sql postgresql select

我有一份针对特定设施的特定问题的调查表。 每个月可以对设施进行一次(数据输入)监控。 现在我需要针对问题的最新数据(值) 但是如果没有针对任何问题的最新数据,我将遍历同月的以前的记录(以前的日期)。

我可以获取最新记录,但我不知道如何获取同一月ID的先前记录,没有最新数据。

我正在使用PostgreSQL 10。

表结构是

enter image description here

所需的输出是

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试使用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

答案 1 :(得分:0)

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

使用window functions

  1. first_value(value) OVER ...为您提供窗框的第一个值。框架是一组facilityidquestion。在该组中,行按日期DESC排序。因此,无论是哪个日期,最后一个值都是第一个
  2. DISTINCT过滤了绑定值(例如facility == 1idquestion == 7有两个值)

请注意:

“日期”是Postgres中的保留字。强烈建议重命名您的列,以避免出现某些麻烦。此外,在Postgres中,建议使用小写字母。