为PostgreSQL中的多列和不同行选择第一个非空值

时间:2017-03-06 18:26:14

标签: postgresql select distinct

我尝试根据表格创建视图。我希望得到一组存在tax_id_no的行,每行包含最新信息。所以我按时间戳降序排序。但是,每个tax_id_no可以有多行,并不是每一行都有所有信息。所以我想获得每列的第一个有效信息。现在我得到了这个:

SELECT * FROM
(
SELECT DISTINCT ON (store_id, tax_id_no)
    event_id,
    event_tstamp,
    owner_id,
    store_id,
    tax_id_no,
    first_value(year_built) OVER (ORDER BY year_built IS NULL, event_tstamp) AS year_built, --New
    first_value(roof_replaced_year) OVER (ORDER BY roof_replaced_year IS NULL, event_tstamp) AS roof_replaced_year, --New
    first_value(number_of_rooms) OVER (ORDER BY number_of_rooms IS NULL, event_tstamp) AS number_of_rooms, --New

FROM MySchema.Event
WHERE tax_id_no IS NOT NULL AND tax_id_no != ''
order by store_id, tax_id_no, event_tstamp DESC
) t1
WHERE owner_id IS NOT NULL OR owner_id != '';

虽然每行获得相同的第一个有效信息。所以不是得到这样的结果,而是我想要的结果:

event_id    event_tstamp    owner_id    store_id    tax_id_no   year_built  roof_replaced_year  number_of_rooms
04          2016-05-12      123         02          12345       1996        2009                6
05          2017-02-02      245         02          23456       1970        1999                8
08          2017-03-03      578         03          34567       2002        2016                10

我得到了这个,first_value列中所有行看起来都一样:

event_id    event_tstamp    owner_id    store_id    tax_id_no   year_built  roof_replaced_year  number_of_rooms
04          2016-05-12      123         02          12345       1996        2009                6
05          2017-02-02      245         02          23456       1996        2009                6
08          2017-03-03      578         03          34567       1996        2009                6

是否可以为每一行选择不同的first_value?我想我可以在同一个表中的多个选项中进行某种联接,但我不确定这实际上会为每行提供唯一值,而不是再次出现相同的问题。还有这样的查询需要考虑的时间长度,到目前为止这些时间非常昂贵。

1 个答案:

答案 0 :(得分:1)

您可以在应用函数之前使用窗口函数中的分区对行进行分组。这将为每个分区生成不同的结果。

例如:

first_value(number_of_rooms) OVER (
    PARTION BY tax_id_no 
    ORDER BY number_of_rooms IS NULL, event_tstamp
) AS number_of_rooms,