Мне нужно выбрать только самое важное значение из таблицы. Использование Postgre SQL (последняя версия) Следит образец данных:SQL Первая строка только после агрегирования правил
Таблица Компания
Id, Name, ExternalId, StartAt
1 Comp1 54123 21/05/2000
2 Comp2 23123 21/05/2000
Таблица Адрес
Id, Company, Address_Type, City
1 1 7 A
2 2 2 B
3 2 62 C
Таблица Adress_Type
Id, Name, importance_order
62 Adt1 1
7 Adt2 2
2 Adt3 2
Что мне нужно сделать, это получить компанию и ее главный адрес, основанный на «important_order». Существует уже есть функция, которая возвращает этот результат:
Create function~~~~
Select * from Company c
join Address a on c.address_id = a.id
Join AddressType at on a.adresstype_id = at.id
ORDER by at.importance_order
Limit 1
Моя проблема сейчас в том, что эта функция вызывается один раз для каждой строки в запросе, и это занимает так много времени (около 20 мин.). Должна ли быть сделана аналогичная попытка, соединяя таблицы? Мне нужно это соединение, чтобы получить первый «самый важный» адрес, а затем получить название города, но нужно сделать это «быстрее». Мне нужно уменьшить число подзапросов до минимального.
Select * from table t
inner join Company c on t.company_id = c.id
left join address a on (c.company_id = c.id)
left join addresstype at on (a.adresstype_id = at.id)
where at.id = (
select max(id) from addresstype
where adresstype in (
select adresstype from adress where company_id = c.id
)
)
Если неясно, скажите мне, что я больше подробно расскажу.
Спасибо.
Делать это я получаю только 1 строку для всех записей, но мне нужно, чтобы получить 1 строку для каждой компании. Не следует ли мне как-то сбросить RN, например, используя группу? – lucassig
Сделано редактирование, см. После того, как ключевое слово OVER добавило предложение раздела на основе идентификатора компании – Santhosh
Это идеальное решение, именно то, что мне нужно. Большое спасибо. Окончательный запрос на 5 раз быстрее: D – lucassig