#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. Да, мне следовало бы знать лучше.