2013-11-20 4 views
0

Мне нужно выбрать только самое важное значение из таблицы. Использование 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 
      ) 
     ) 

Если неясно, скажите мне, что я больше подробно расскажу.

Спасибо.

ответ

0

Для этого нужно PostgreSQL 8.4+, я полагаю,

SELECT T.* 
FROM TABLE AS T 
INNER JOIN 
(
    SELECT * FROM 
    (
     SELECT C1.*, ROW_NUMBER() OVER(partition by C1.ID ORDER BY T.IMPORTANCE_ORDER) AS RN 
     FROM COMPANY AS C1 
     INNER JOIN ADDRESS AS A 
     ON C1.ID = A.COMPANY 
     INNER JOIN ADDRESS_TYPE AS T 
     ON T.ID = A.ADDRESS_TYPE_ID 
    ) A 
    WHERE RN = 1 
) AS B 
ON B.ID= T.COMPANY_ID 
+0

Делать это я получаю только 1 строку для всех записей, но мне нужно, чтобы получить 1 строку для каждой компании. Не следует ли мне как-то сбросить RN, например, используя группу? – lucassig

+0

Сделано редактирование, см. После того, как ключевое слово OVER добавило предложение раздела на основе идентификатора компании – Santhosh

+0

Это идеальное решение, именно то, что мне нужно. Большое спасибо. Окончательный запрос на 5 раз быстрее: D – lucassig

Смежные вопросы