鉴于下表,我试图选择按时间排序的不同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'
答案 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);
使用相同的索引,这应该具有竞争力。