Postgres - применять отличное после заказа в совершенном виде - PullRequest
0 голосов
/ 28 мая 2018

Учитывая следующую таблицу, я пытаюсь выбрать различные значения идентификатора, упорядоченные по времени.Тем не менее, я хочу, чтобы порядок по времени применялся перед отличным, поэтому выбранная отдельная строка всегда имеет более низкое значение time с этим id.Можно ли сделать это быстрым способом - таблица может содержать миллионы строк, и я не хочу делать никаких операций, которые не нужны (например, сначала используйте подзапрос, чтобы упорядочить их по времени, а затем примените разные)

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 голосов
/ 28 мая 2018

Вы хотите 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);

С тем же индексом это должно быть конкурентоспособным по производительности.

...