PostgreSQL показывает последнюю дату и одно значение столбца из многих

#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. Спасибо, это сработало. Я буду иметь в виду ваши предложения.