Как получить набор сгруппированных данных с помощью запроса postgres

#postgresql

Вопрос:

Мои данные таблицы бд являются,

 id,name,start_time,expire_time,status
1,Jim,2021-08-12 22:00:00,2021-08-15 22:00:00,completed
2,Joe,2021-08-12 22:00:00,2021-08-15 23:00:00,completed
3,Tom,2021-08-12 22:00:00,2021-08-15 24:00:00,completed
4,brad,2021-08-13 17:00:00,2021-08-15 22:00:00,completed
5,Jim,2021-08-14 22:00:00,2021-08-15 13:00:00,completed
6,Tom,2021-08-14 22:00:00,2021-08-15 14:00:00,completed
7,Joe,2021-08-14 22:00:00,2021-08-15 215:00:00,completed
 

мне нужно сгруппировать эту таблицу по времени начала и выбрать только группу, отличную по имени. Например, в приведенной выше таблице строки 1,2 и 3 имеют одинаковое начальное значение, а 5,6 и 7 имеют другое одинаковое значение. Поскольку эти 2 набора записей имеют одинаковое имя, мне нужно отобразить только 1, который упорядочен по времени начала. Тогда строка 4 будет там как одна запись. Таким образом, конечный результат должен быть

 1,Jim,2021-08-12 22:00:00,2021-08-15 22:00:00,completed
2,Joe,2021-08-12 22:00:00,2021-08-15 23:00:00,completed
3,Tom,2021-08-12 22:00:00,2021-08-15 24:00:00,completed
4,brad,2021-08-13 17:00:00,2021-08-15 22:00:00,completed
 

Поэтому я попытался выполнить следующий запрос. но я мог бы получить правильный результат

 Select distinct on (name) * 
from table
where status='completed'
group by start_time
 

Предложите правильный запрос для моего случая

Комментарии:

1. Вам не нужно group by , если вы используете distinct . Единственная проблема заключается в том, что SQL не гарантирует, КАКУЮ из повторяющихся записей он вернет. Для тебя это имеет значение?

2. да, мне нужно получить самый старый набор start_time

Ответ №1:

Если предположить, что самое раннее время начала связано с самым ранним временем истечения срока действия, это должно сработать:

 SELECT id, name, min(start_time) AS start_time,
       min(expire_time) AS expire_time, status
FROM table
WHERE status='completed'
GROUP BY name,status;
 

Комментарии:

1. когда вы включаете идентификатор в предложение group by, в нем будут перечислены все записи

2. Да, мне следовало бы знать лучше.