WedX - журнал о программировании и компьютерных науках

эффективный способ получить последние данные с помощью MAX()

У меня есть таблица, в которой хранятся курсы обмена валют на определенный день (TBAADM.EXC). Однако обменные курсы вводятся вручную, а введенный ранее ошибочный курс должен быть заархивирован, поэтому в таблице может оказаться несколько записей заданного обменного курса «от-до» в день из-за ошибки пользователя или из-за того, что обменный курс изменился во время день. Для этого у меня есть столбец в таблице с именем UPDATE_NO, который указывает, что данная запись является n-й записью за день. Например, первая запись обменного курса за день будет иметь UPDATE_NO значение 001. Если обменный курс изменился или был введен неправильно, следующая запись будет иметь значение 002 и так далее.

Что мне нужно сделать сейчас, так это получить последнюю запись обменного курса от-до за данный день:

select exc_rate
from tbaadm.exc
    where bank_id = 'BANK01'
    and designation = 'REV'
    and fr_crncy_code = 'USD'
    and to_crncy_code = 'PHP'
    and rtlist_date = '10-AUG-2015'
    and update_no = --maximum

Это то, что у меня сейчас есть, но я думаю, что это определенно повлияет на время выполнения моего скрипта, поскольку я дважды просматриваю таблицу EXC для каждой записи:

select exc_rate
    from tbaadm.exc
    where bank_id = 'BANK01'
    and designation = 'REV'
    and fr_crncy_code = 'USD'
    and to_crncy_code = 'PHP'
    and rtlist_date = '10-AUG-2015'
    and update_no = (select max(update_no) from tbaadm.exc
        where bank_id = 'BANK01'
        and designation = 'REV'
        and fr_crncy_code = 'USD'
        and to_crncy_code = 'PHP' 
        and rtlist_date = '10-AUG-2015')    

Есть ли более эффективный способ использования функции MAX()? Любая помощь будет оценена.


  • Если вы находитесь в одном и том же сеансе, вы можете использовать последовательность, чтобы заставить этот процесс работать. Вы обновляете свой update_no значением последовательности sequenceName.NEXTVAL, а затем просто используете на своем select update_no =sequenceName.CURRVAL, который будет последним (максимальным) номером обновления. 17.02.2016

Ответы:


1

Просто добавив, что мы также можем использовать аналитические функции с функцией KEEP, чтобы ограничить вывод в самом запросе. При этом не нужно переходить через INLINE-представление, и с точки зрения производительности это лучше. Надеюсь это поможет.

SELECT DISTINCT exc_rate,
MAX(update_no) KEEP (DENSE_RANK FIRST
ORDER BY update_no) OVER (PARTITION BY bank_id,designation,fr_crncy_code,to_crncy_code,rtlist_date) "Max dt"
FROM tbaadm.exc
WHERE bank_id     = 'BANK01'
AND designation   = 'REV'
AND fr_crncy_code = 'USD'
AND to_crncy_code = 'PHP'
AND rtlist_date   = '10-AUG-2015' ;
17.02.2016

2
select exc_rate
from (
select exc_rate
    , ROW_NUMBER() OVER (ORDER BY update_no DESC) rnk
    from tbaadm.exc
    where bank_id = 'BANK01'
    and designation = 'REV'
    and fr_crncy_code = 'USD'
    and to_crncy_code = 'PHP'
    and rtlist_date = '10-AUG-2015'

) i
where i.rnk = 1

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm

Обновить:

select exc_rate
from (
select exc_rate
    , fr_crncy_code
    , ROW_NUMBER() OVER (ORDER BY update_no DESC) rnk
    from tbaadm.exc
    where bank_id = 'BANK01'
    and designation = 'REV'
    and to_crncy_code = 'PHP'
    and rtlist_date = '10-AUG-2015'

) i
where i.rnk = 1
    AND fr_crncy_code = 'usd'
17.02.2016
  • как насчет того, чтобы некоторые условия (например, fr_crncy_code) сравнивались с суперзапросом (fr_crncy_code = cq.crncy_code)? Я пытался, но он говорит table or view does not exist. 17.02.2016
  • @JamesP Затем в подзапросе вы выбираете fr_crncy_code без where и используете where во внешнем выборе. Смотрите обновление. 17.02.2016

  • 3

    Я добавил некоторые изменения в сценарий Авраджита Роя:

    SELECT MAX(exc_rate) KEEP (DENSE_RANK LAST ORDER BY update_no) as needed_rate
    FROM tbaadm.exc
    WHERE bank_id     = 'BANK01'
    AND designation   = 'REV'
    AND fr_crncy_code = 'USD'
    AND to_crncy_code = 'PHP'
    AND rtlist_date   = '10-AUG-2015' ;
    

    Если вам нужно найти последние ставки для всех групп, добавьте предложение group by

    17.02.2016
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]