Эффективный способ объединить 2 таблицы и получить строку с максимальным годом с предпочтением одной из таблиц - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь объединить 2 таблицы (key_ratios_cnd и key_ratios_snd), обе таблицы идентичны, а столбцы первичного ключа для обеих таблиц - символьные и fiscal_year.

В конечном наборе результатов я хочу строку с максимальным годом вобе таблицы для каждого символа.если в обеих таблицах присутствует строка с максимальным годом, то следует выбрать строку из key_ratios_cnd.

Я приведу ниже SQL-запрос, чтобы получить результат.Я хотел бы знать, есть ли другой способ написать запрос, который является более оптимизированным.

select sq2.*
from 
    (select sq.*,
           max(id) over(partition by sq.symbol) as max_id,
           max(fiscal_year) over(partition by sq.symbol) as max_year
     from 
        ( select *,'2' as id
        from test.key_ratios_cnd
        union all
        select *,'1' as id
        from test.key_ratios_snd
        ) as sq
    ) as sq2
where id = max_id and fiscal_year = max_year
order by symbol asc

1 Ответ

0 голосов
/ 22 сентября 2018

Я бы выбрал строку из каждой таблицы сначала , а затем объединил.В Postgres есть distinct on, который идеально подходит для этой цели.

select distinct on (symbol) sc.*
from ((select distinct on (cnd.symbol) cnd.*, 1 as ord
       from test.key_ratios_cnd cnd
       order by cnd.symbol, cnd.fiscal_year desc
      ) union all
      (select distinct on (snd.symbol) cnd.*, 2 as ord
       from test.key_ratios_cnd cnd
       order by snd.symbol, snd.fiscal_year desc
      )
     ) sc
order by symbol, fiscal_year desc, ord;

Чтобы ускорить это, добавьте индекс (symbol, fiscal_year desc) к каждой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...