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

map*_*dom 2 postgresql distinct distinct-on postgresql-9.4

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

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
Run Code Online (Sandbox Code Playgroud)

我的工作如下

创建街道编号VIEW为(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
Run Code Online (Sandbox Code Playgroud)

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

Abe*_*sto 5

您无需创建一堆视图,只需:

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;
Run Code Online (Sandbox Code Playgroud)

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

create index index_name on your_table(street, house_number, date_of_sale desc);
Run Code Online (Sandbox Code Playgroud)

不要忘了analyse定期到桌子上(取决于增长的速度):

analyse your_table;
Run Code Online (Sandbox Code Playgroud)


OTA*_*TAR 4

row_number您可以为此使用窗口函数

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
Run Code Online (Sandbox Code Playgroud)