Пошук курсу валюти. SQL-запит в Oracle.

Необхідно написати SQL запит, який виводить значення курсу валюти на задану дату. Таке питання може бути поставлене на співбесіді при прийомі на роботу в якості розробника баз даних. Питання не настільки простий, як може здатися.


Постановка завдання:


Є таблиця змін курсу валют T_CURRENCY:
















CODE varchar2(32) Код валюти (USD, RUR, …)
DATE_C date Дата зміни курсу
VALUE number Значення курсу

Дані заносяться в цю таблицю кожен раз, коли змінюється значення курсу будь-якої валюти. Напишіть SQL запит, за допомогою якого можна отримати значення курсу для заданої валюти на задану дату.


Рішення:


При вирішенні цього завдання необхідно зміркувати, що курси валют змінюються не щодня. Наприклад, у вихідні змін немає, а запросити значення цікавить нас валюти ми можемо на будь-яку дату, у тому числі і на будь-який вихідний. Відповідно, простий запит на рівність дати буде неправильним рішенням. Якщо ця обставина відзначити при відповіді, то завдання може вважатися наполовину вирішеною, оскільки цим ви продемонструєте знання предметної області, що важливо. Якщо люди, які проводять співбесіду, адекватні, то це вже буде великим плюсом.


Зовсім буде непогано, якщо ми в рішенні напишемо DDL для створення потрібної нам таблиці і визначення первинного ключа, додатково продемонструвавши вміння створювати таблиці скриптами, а не тупо за допомогою якого-небудь SQL Navigator-а:


create table T_CURRENCY


( CODE   varchar2(32) not null,


DATE_C date         not null,


VALUE  number       not null


);


alter table T_CURRENCY


add constraint PK_T_CURRENCY


primary key (CODE,DATE_C)


usingindexpctfree 0;


Дані для тіста


insert into T_CURRENCY values ("USD", to_date ("25.05.2009", "DD.MM.YYYY"), 31);


insert into T_CURRENCY values ("USD", to_date ("26.06.2009", "DD.MM.YYYY"), 32);


insert into T_CURRENCY values ("USD", to_date ("29.06.2009", "DD.MM.YYYY"), 30);


commit;


Далі слід трохи подумати і реалізувати запит з урахуванням зазначеного вище обставини. Класичний варіант запиту з використанням вкладені запити буде мати вигляд:


select CODE, VALUE


from T_CURRENCY


where DATE_C = (select max(DATE_C)


from T_CURRENCY


where DATE_C <= to_date(“27.06.2009″,”DD.MM.YYYY”)


)


andCODE=”USD”;


Цей запит виведе курс долара на задану дату. У вкладені запити ми шукаємо максимальну дату меншу, ніж задану. Все ж у відповіді краще буде написати запит, використовуючи змінні підстановки:


select CODE, VALUE


from T_CURRENCY


where DATE_C = (select max(DATE_C)


from T_CURRENCY


where DATE_C <= : DATE_C


)


andCODE= :CODE;


Можна також додатково написати варіант вирішення цього завдання, використовуючи PL / SQL функцію, демонструючи власні знання:


create or replace


function GET_CURRENCY (psCODE in varchar2, – Кодвалюти


pdDATE in date – Датаактуальності


) return number


is


begin


for i in (select VALUE


from T_CURRENCY


where CODE = psCODE


and DATE_C <= pdDATE


order by DATE_C desc


)


loop


return i.VALUE;


end loop;


return null;


end GET_CURRENCY;


З точки зору продуктивності використання PL / SQL функції в цьому виді більш переважно, ніж використання запиту з вкладені запити, так як в PL / SQL функції не потрібно подвійного сканування таблиці з даними.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*