Курсы валют

Имеется таблица курсов валют следующей структуры:

CREATE TABLE "CURRENCY_RATE" 
("CURR_ID" INTEGER,
 "DATE_RATE" DATE,
 "RATE" NUMBER
) TABLESPACE MIRAVILD_DATA;
 
COMMENT ON TABLE "CURRENCY_RATE" IS 'Курс валюты';
COMMENT ON COLUMN "CURRENCY_RATE"."CURR_ID" IS 'Идентификатор валюты';
COMMENT ON COLUMN "CURRENCY_RATE"."DATE_RATE" IS 'Дата курса';
COMMENT ON COLUMN "CURRENCY_RATE"."RATE" IS 'Значение курса';

CREATE UNIQUE INDEX "U_IDX_CURRENCY_RATE" ON "CURRENCY_RATE" ("CURR_ID", "DATE_RATE") TABLESPACE MIRAVILD_INDEX;

ALTER TABLE "CURRENCY_RATE" ADD CONSTRAINT "PK_CURRENCY_RATE" PRIMARY KEY ("CURR_ID", "DATE_RATE") 
USING INDEX "U_IDX_CURRENCY_RATE" ENABLE VALIDATE;
/

Курс валюты устанавливается не на каждую календарную дату.
Уникальный ключ: curr_id + date_rate.
Напишите запрос, который покажет действующее значение курса заданной валюты на любую заданную календарную дату.

Пример данных:

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (1, to_date('01.01.2010', 'dd.mm.yyyy'), 30);

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (2, to_date('01.01.2010', 'dd.mm.yyyy'), 40);

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (1, to_date('02.01.2010', 'dd.mm.yyyy'), 32);

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (1, to_date('05.01.2010', 'dd.mm.yyyy'), 33);

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (2, to_date('08.01.2010', 'dd.mm.yyyy'), 41);

INSERT INTO currency_rate
  (curr_id, date_rate, rate)
VALUES
  (2, to_date('15.01.2010', 'dd.mm.yyyy'), 42);

COMMIT WORK;
/

Варианты запроса:

-- Для валюты 1 на 03.01.2010 получить курс 32
SELECT cr_out.rate
  FROM currency_rate cr_out
 WHERE cr_out.curr_id = 1
   AND cr_out.date_rate =
       (SELECT MAX(cr_in.date_rate)
          FROM currency_rate cr_in
         WHERE cr_in.curr_id = cr_out.curr_id
           AND cr_in.date_rate <= to_date('03.01.2010', 'dd.mm.yyyy'));
/

-- Для валюты 2 на 10.01.2010 получить курс 41
SELECT cr_out.rate
  FROM currency_rate cr_out
 WHERE cr_out.curr_id = 2
   AND cr_out.date_rate =
       (SELECT MAX(cr_in.date_rate)
          FROM currency_rate cr_in
         WHERE cr_in.curr_id = cr_out.curr_id
           AND cr_in.date_rate <= to_date('10.01.2010', 'dd.mm.yyyy'));
/

P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776

Tags: ,

Comments are closed.