Подзапрос SQL Query (второй уровень) - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть запрос, который выдает ошибку уровня.Это таблица с обменными курсами в двух направлениях

currency_from | currency_to | convertion rate
        ARS   |   USD       | 0.20
        USD   |   ARS       | 20.00

Я хочу получить одну из игр, например, ту, которая имеет наибольшее значение

currency_from | currency_to | convertion rate
        USD   |   ARS       | 20.00

ВВ таблице, очевидно, существует множество комбинаций разных валют, и следующий запрос решит проблему, но он не достигает второго уровня

select *
from gl.gl_daily_rates gdr
where  gdr.conversion_date = to_date('20180301','YYYYMMDD')
and    gdr.conversion_rate = (select max(total.conversion_rate)
                              from   (select gdr2.conversion_rate
                                      from   gl.gl_daily_rates gdr2
                                      where  gdr2.conversion_date = gdr.conversion_date
                                      and    gdr2.from_currency   = gdr.from_currency
                                      and    gdr2.to_currency     = gdr.to_currency
                                      union all
                                      select gdr3.conversion_rate
                                      from   gl.gl_daily_rates gdr3
                                      where  gdr3.conversion_date = gdr.conversion_date
                                      and    gdr3.from_currency   = gdr.to_currency
                                      and    gdr3.to_currency     = gdr.from_currency
                                      ) total);

Кто-нибудь задумывается, как его можно решить?Спасибо.

Ответы [ 2 ]

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

Возможно, я что-то упустил, но гораздо более простое решение было бы:

SELECT *
  FROM gl.gl_daily_rates gdr
 WHERE     gdr.conversion_date = TO_DATE ('20180301', 'YYYYMMDD')
       AND conversion_rate =
           (SELECT MAX (conversion_rate)
              FROM gl.gl_daily_rates gdr
             WHERE gdr.conversion_date = TO_DATE ('20180301', 'YYYYMMDD'));
0 голосов
/ 14 сентября 2018

Для этого вы можете использовать оконные функции:

select *
from (select gdr.*,
             max(conversion_rate) over (partition by least(currency_from, currency_to), greatest(currency_from, currency_to) ) as max_cr
      from gl.gl_daily_rates gdr
      where gdr.conversion_date = to_date('20180301','YYYYMMDD') 
     ) gdr
where conversion_rate = max_cr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...