我在表格中设置数据如下,日期存储为日期类型。 我只想要每行(房子)的最新日期,每个房子的条目数有所不同,有时可能有一次销售有时多次。
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
这样可行,但似乎应该有一个更优雅的解决方案。我可以一步到达过滤后的视图吗?
答案 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