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

Postgresql 仅选择postgres中具有最新日期的行,postgresql,distinct,postgresql-9.4,distinct-on,Postgresql,Distinct,Postgresql 9.4,Distinct On,我在一个表中设置了如下数据,其中日期存储为日期类型。 我只想知道每一行(房子)的最新日期。每套房子的登记数量不尽相同,有时可能是一次销售,有时是多次销售 Date of sale | house number | street | price |uniqueref -------------|--------------|--------|-------|---------- 15-04-1990 |1 |castle |100000-| 1xzytt 15-

我在一个表中设置了如下数据,其中日期存储为日期类型。 我只想知道每一行(房子)的最新日期。每套房子的登记数量不尽相同,有时可能是一次销售,有时是多次销售

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
我的工作如下

创建
视图
作为(v_orderedhouses)
订购人
门牌号,街道,日期在
DESC
上订购,以便首先返回最新日期

然后,我使用(门牌号,街道)上的
DISTINCT将其输入另一个
视图
(v_latesthouse)。这给了我

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

这是可行的,但似乎应该有一个更优雅的解决方案。我可以一步进入过滤视图吗

您可以为此使用窗口功能
行数

select  * from (
   select your_table.*, row_number() over(partition by house_number order by Date_of_sale desc) as rn from your_table
) tt
where rn = 1

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

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;
为了加快查询速度,您可以根据
的顺序创建索引:

create index index_name on your_table(street, house_number, date_of_sale desc);
别忘了定期检查您的桌子(取决于生长速度):


这就是我所使用的,而且工作速度很快(这是一个通用的解决方案,据我测试,每个数据库软件都可以做到这一点):


我可以用col1、col2和col3进行分区吗?有多个编号为1的房子,所以需要确保我能抓住all@mappingdom-是的,您可以按多列进行分区,例如:
…按col1、col2、col3进行分区…
谢谢,有趣的是,358.9与316.5的执行速度稍慢。不过写起来要快得多!仅供参考-您会发现在上使用
distinct的速度明显更快(也更短)。哇,真让人吃惊。编译索引花了一段时间,但20秒后创建了一个物化视图。作为一个新手,创建自定义索引的角色是什么?你能提供这个答案吗
analyse your_table;
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