仅选择postgres中具有最新日期的行

时间:2017-04-19 14:56:58

标签: postgresql distinct postgresql-9.4 distinct-on

我在表格中设置数据如下,日期存储为日期类型。 我只想要每行(房子)的最新日期,每个房子的条目数有所不同,有时可能有一次销售有时多次。

Date of sale | house number | street | price |uniqueref
-------------|--------------|--------|-------|----------
15-04-1990   |1             |castle  |100000-| 1xzytt   
15-04-1995   |1             |castle  |200000-| 2jhgkj
15-04-2005   |1             |castle  |800000-| 3sdfsdf
15-04-1995   |2             |castle  |200000-| 2jhgkj
15-04-2005   |2             |castle  |800000-| 3sdfsdf

我的工作如下

创建VIEW as(v_orderedhouses)ORDER BY门牌号码,街道上的日期在DESC上排序,以便首先返回最新日期。

然后我使用VIEW(门牌号码,街道)将其反馈到另一个DISTINCT ON(v_latesthouses)。这给了我;

Date of sale | house number | street | price |uniqueref
-------------|--------------|--------|-------|----------
15-04-2005   |1             |castle  |800000-| 3sdfsdf
15-04-2005   |2             |castle  |800000-| 3sdfsdf

这样可行,但似乎应该有一个更优雅的解决方案。我可以一步到达过滤后的视图吗?

3 个答案:

答案 0 :(得分:3)

您不需要创建一堆视图,只需:

select distinct on(street, house_number)
  *
from your_table
order by
  street, house_number, -- those fields should be in the "order by" clause because it is in the "distinct on" expression
  date_of_sale desc;

为了使此查询更快,您可以根据order by

创建索引
create index index_name on your_table(street, house_number, date_of_sale desc);

不要忘记定期analyse你的桌子(取决于成长的速度):

analyse your_table;

答案 1 :(得分:1)

您可以为此

使用窗口函数{{1}}
{{1}}

答案 2 :(得分:0)

这是我使用的,它运行得很快(是一个通用的解决方案,据我测试,每个数据库软件都可以这样做):

SELECT t1.date_of_sale, t1.house_number
FROM table t1
LEFT JOIN table t2 ON (t2.house_number = t1.house_number AND t2.date_of_sale>t1.date_of_sale)
WHERE t2.pk IS NULL
GROUP BY t1.date_of_sale, t1.house_number