Имеется таблица курсов валют следующей структуры:
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