我尝试根据表格创建视图。我希望得到一组存在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
?我想我可以在同一个表中的多个选项中进行某种联接,但我不确定这实际上会为每行提供唯一值,而不是再次出现相同的问题。还有这样的查询需要考虑的时间长度,到目前为止这些时间非常昂贵。
答案 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,