Joomla 3.1 Templates by FatCow Coupon

Задача с валютами

Категория: Блог Опубликовано 23.05.2017

Исходные данные
-- есть таблица в с номером валюты, датой заполнения курса, курсом валюты
-- оператор вводит курс валюты, когда он поменялся , то есть если несколько дней подряд одинаковый курс - то, в таблице будет единственное значение курса на дату изменения
-- необходимо вывести курс валюты на заданную дату , по каждой валюте
-- если на данную дату нет курса тогда выводится курс на последнюю дату, если в заданную дату курс менялся несколько раз , то надо вывести все изменения
-- Подготовим данные для примера
-- создадим таблицу с валютами\

 

 

create table cratio as
(
  select 
    trunc(sysdate-dbms_random.value*10) ddate -- случайная дата отдаленная от текущего числа на случайное количество дней
  , trunc(dbms_random.value*3+1)  currency -- случайный номер валюты - идентификатор от 1 до 3
  , trunc(dbms_random.value*10) ratio  -- курс валюты от 1 до 10
     from dual
  connect by level <= 30)



-- задача с валютами решение без групповых функций

SELECT * FROM cratio cc  WHERE cc.ddate = (
SELECT c2.ddate FROM cratio c1 ,cratio c2
  WHERE  c1.ddate <= :dt
  AND c1.currency = cc.currency
  AND c2.currency = cc.currency
  AND c2.ddate=c1.ddate
MINUS  
SELECT c2.ddate FROM cratio c1 ,cratio c2
  WHERE  c1.ddate <= :dt 
    and c1.currency = cc.currency
    AND c2.currency = cc.currency
    AND c2.ddate<c1.ddate)
  


-- решение с MAX - групповыми функциями

  SELECT *
  FROM cratio c1
 WHERE ddate =
   (
   SELECT max(ddate)
     FROM cratio c2
    WHERE ddate <= :okdate -- пользовательский параметр
      AND c1.currency = c2.currency
    )



DDATE CURRENCY RATIO
16.11.2012 1 9
16.11.2012 3 5
16.11.2012 2 0
16.11.2012 2 3

-- Для протокола, решение на "авангардном" SQL:
WITH t AS
(SELECT trunc(sysdate - level + 1) dat
,CASE trunc(dbms_random.VALUE(0
,2))
WHEN 0 THEN
NULL
ELSE
level
END rate
FROM dual
CONNECT BY level <= 100
ORDER BY dat)
SELECT dat
,rate
,last_value(rate IGNORE NULLS) OVER(ORDER BY dat) actual_rate
FROM t
ORDER BY dat

 

 

Просмотров: 389