Postgres - 以高效的方式在订单后应用明确的

时间:2018-05-28 15:11:41

标签: sql postgresql distinct

鉴于下表,我试图选择按时间排序的不同id值。但是,我希望按时间顺序在不同之前应用顺序,因此所选的不同行始终与time一起使用较低的id。是否有可能以高效的方式这样做 - 表可以有数百万行,我不想做任何不必要的操作 - (例如首先使用子查询按时间排序然后应用不同的)< / p>

id  | time | value
1   | 0:00 |  'a'
1   | 2:00 |  'b'
2   | 4:00 |  'c'
2   | 3:00 |  'd'
2   | 2:00 |  'e'
3   | 5:00 |  'f'
3   | 3:00 |  'g'

1 个答案:

答案 0 :(得分:2)

您想要distinct on

select distinct on (id) t.*
from t
order by id, time asc;

在Postgres中,这通常是性能最佳的解决方案。您需要(id, time)上的索引。

您也可以尝试:

select t.*
from t
where t.time = (select min(t2.time) from t t2 where t2.id = t.id);

使用相同的索引,这应该具有竞争力。