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)
这可行,但似乎应该有一个更优雅的解决方案。我可以一步一步进入过滤视图吗?
您无需创建一堆视图,只需:
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)
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)
| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |