powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
18 сообщений из 18, страница 1 из 1
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036158
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица: код валюты, значение курса, дата начала действия курса. Данные в таблицу записываются каждый раз, когда меняется курс валюты. Нужно получить курс валюты на заданную дату.

С помощью max (date_c) keep (dense_rank last order by date_c) можно найти нужную дату из таблицы, но в одну дату может быть несколько записей и получить нужно не дату, а значения курса). Например, к исходным данным ниже ещё нужно добавить изменение курса по eur в один день: select 'eur', 7, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all

with K (COD, VAL, DATE_C) as (
select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
select max (date_c) keep (dense_rank last order by date_c) from K
where date_c<='06.07.2020'
and cod='eur'
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036162
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и да, на каждую дату в таблице будет и eur и usd и если в день несколько раз курс меняется, то дата будет в формате с минутами.
Можно особо не обращать на данные в таблице, это больше для пояснения задачи
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036167
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tort3
Ну и да, на каждую дату в таблице будет и eur и usd и если в день несколько раз курс меняется, то дата будет в формате с минутами.

Чтобы различать eur и usd вполне достаточно условия в where ... and cod='eur', либо, если нужно на текущую дату выводить курсы всех имеющихся валют, то нужно переписать запрос с использованием group by COD.
Если дата будет с минутами то, и условие выбора должно учитывать это.
авторполучить нужно не дату, а значения курса
Для этого достаточно заменить поле даты на поле курса:
Код: plsql
1.
max (val) keep (dense_rank last order by date_c)
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036170
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курс на заданную дату определяется как последнее по дате-времени значение всех записей дата-время которых меньше или равно входного значения? Или есть ещё оговорки?

Пока что выглядит на обычный row_number()
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036176
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3,

по старинке
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ed
Wrote file afiedt.buf

  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
  8* select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
SQL> /

COD        VAL DATE_C
--- ---------- ----------
usd          5 01.01.2020
eur          6 05.03.2020



зы
row_number()=1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> ed
Wrote file afiedt.buf

  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
  8  --select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
  9  select * from (
 10    select k.*
 11     ,row_number() over (partition by cod order by date_c desc) rn
 12    from k where date_c<='06.07.2020')
 13* where rn=1
SQL> /

COD        VAL DATE_C             RN
--- ---------- ---------- ----------
eur          6 05.03.2020          1
usd          5 01.01.2020          1

SQL>


.....
stax
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036178
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
Условие звучит так: получить курс на заданную дату.
Можно интерпретировать как получить все значение курса на определенную дату
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036181
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

в одну дату может быть несколько записей для одной валюты
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036182
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3,

Если на вход пришло 01.01.2021, это означает
  • < 01.01.2021 00:00:00
  • <= 01.01.2021 00:00:00
  • <= 01.01.2021 23:59:59
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036186
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3
Stax,

в одну дату может быть несколько записей для одной валюты

какую из нескольких брать?

ps
предлагаю avg

....
stax
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036189
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

<= 01.01.2021 23:59:59
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036193
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Нужно вывести все значения на указанную дату
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036196
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3,

Стас уже привёл решения, осталось только входной параметр правильно написать.
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036203
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3
Stax,

Нужно вывести все значения на указанную дату


rank
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  8  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
  9  --select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
 10  select * from (
 11    select k.*
 12     ,rank() over (partition by cod order by date_c desc) rn
 13    from k where date_c<='06.07.2020')
 14* where rn=1
SQL> /

COD        VAL DATE_C             RN
--- ---------- ---------- ----------
eur          6 05.03.2020          1
usd          5 01.01.2020          1
usd          5 01.01.2020          1



ps
обычно курс нужен на дату со временем
или берут на начало/клнец дня

....
stax
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036207
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

В этом примере потеряли 'eur', 5, to_date ('01.01.2020')
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036210
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3,

Там на самом деле trunc(date_c) потерялся, но для понимания идеи это не так важно
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036213
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3
Stax,

В этом примере потеряли 'eur', 5, to_date ('01.01.2020')


ничего не понял

курс на (или за/часто ето важно) 06.07.2020 установили '05.03.2020'

курс установленный 01.01.2020 действовал ДО 05.03.2020

мож просто пример с курсом неудачный, и надо что-то другое


ps
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> ed
Wrote file afiedt.buf

  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 7, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  8  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  9  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
 10  --select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
 11  select * from (
 12    select k.*
 13     ,rank() over (partition by cod order by date_c desc) rn
 14    from k where date_c<='06.07.2020')
 15* where rn=1
SQL> /

COD        VAL DATE_C             RN
--- ---------- ---------- ----------
eur          6 05.03.2020          1
eur          7 05.03.2020          1
usd          5 01.01.2020          1
usd          5 01.01.2020          1

SQL>


.....
stax
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036214
tort3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
tort3,

по старинке
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ed
Wrote file afiedt.buf

  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
  8* select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
SQL> /

COD        VAL DATE_C
--- ---------- ----------
usd          5 01.01.2020
eur          6 05.03.2020



зы
row_number()=1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> ed
Wrote file afiedt.buf

  1  with K (COD, VAL, DATE_C) as (
  2  select 'usd', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  3  select 'eur', 5, to_date ('01.01.2020', 'dd/mm/yyyy') from dual union all
  4  select 'eur', 6, to_date ('05.03.2020', 'dd/mm/yyyy') from dual union all
  5  select 'eur', 9, to_date ('07.08.2020', 'dd/mm/yyyy') from dual union all
  6  select 'eur', 12, to_date ('18.11.2020', 'dd/mm/yyyy') from dual union all
  7  select 'eur', 15, to_date ('03.01.2021', 'dd/mm/yyyy') from dual)
  8  --select * from K where date_c=(select max(date_c) from k k2 where k2.cod=k.cod and k2.date_c<='06.07.2020')
  9  select * from (
 10    select k.*
 11     ,row_number() over (partition by cod order by date_c desc) rn
 12    from k where date_c<='06.07.2020')
 13* where rn=1
SQL> /

COD        VAL DATE_C             RN
--- ---------- ---------- ----------
eur          6 05.03.2020          1
usd          5 01.01.2020          1

SQL>


.....
stax


Спасибо! Скорее всего не нужно придумывать сложности и дата уникальна и без времени в таблице. Некорректно составленное ТЗ я считаю
...
Рейтинг: 0 / 0
Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
    #40036325
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tort3

Некорректно составленное ТЗ я считаю


если задача реальная(из жизни)
я б посоветовал добавить в "табличку" поле date_to

.....
stax
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Курс валюты на заданную дату, при условии, что не известна дата начала действия курса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]