#sql #postgresql #greatest-n-per-group
#sql #postgresql #наибольшее число на группу
Вопрос:
У меня проблема с запросом, который я не могу понять. Пробовал некоторое время, но я просто не могу понять это. Было бы очень полезно, если бы вы могли мне помочь. So… У меня есть 4 таблицы:
cars - ID, make, model, plate_number, price, type, year, owner_ID
persons - ID, name, surname, pers_code
insurance_data - company_ID, car_ID, first_date, last_date
companies - ID, title
Мой запрос до сих пор..
SELECT cars.plate_number, persons.name, persons.surname, insurance_data.last_date
FROM cars,persons,insurance_data
WHERE cars.owner_ID = persons.ID AND cars.ID = insurance_data.car_ID
Это выводит номер автомобиля, владельца автомобиля и последнюю дату страховки автомобиля. Но проблема в том, что есть две машины, у которых две даты окончания страхования, поэтому в выходных данных есть две записи для одного и того же автомобиля и с обеими датами окончания страхования. Мне нужно, чтобы для каждого автомобиля была только одна запись, и соответствующая дата окончания страхования должна быть последней.
Я знаю, что это довольно просто, но я студент первого курса баз данных, и это одно из моих первых заданий. Заранее спасибо
Ответ №1:
(1) Никогда не используйте запятые в FROM
предложении. Всегда используйте правильный, явный JOIN
синтаксис.
(2) Используйте псевдонимы таблиц!
Ответ на ваш вопрос DISTINCT ON
:
SELECT DISTINCT ON (c.plate_number) c.plate_number, p.name, p.surname, id.last_date
FROM cars c JOIN
persons p
ON c.owner_ID = p.ID JOIN
insurance_data id
ON c.ID = id.car_ID
ORDER BY c.plate_number, id.last_date DESC;
Комментарии:
1. Спасибо, это сработало. Я буду иметь в виду ваши предложения.