Я уже не малый промежуток своей жизни связан с SQL.
SQL является и подфорумом на данном ресурсе.
Я решил приводить здесь какие-то интересные запросы, с которыми приходилось связываться.
Приводить я буду сначала задачу, а после просмотра рашений других показывать свое решение. Всем будет полезно - полюбому кто-то узнает новое - я ли кто-то другой.
Хотел бы подчеркнуть, что я буду стараться приводить код на T-SQL, но, думаю, большую часть можно будет перевести и на другие синтаксисы и СУБД.
Я, например, часто их перевожу в Access-кий формат.
ЗАДАЧА 1
Начну я с недавно поставленной задачи:
Есть некий идентификатор. Не важно какой, в складской базе это может быть какой-нибудь код позиции. Да, пожалуй возьмем для примеру складскую базу данных.
Есть коды позиций. У каждой позиции есть своя цена. Цена может меняться со временем. Получаем - цена и позиция. Но это безсмысленно иметь, как это обычно бывает, без временных разрезов. Временной разрез здесь - дата установки новой цены.
Итого получаем некую структуру данных, где есть поля КодПозиции, ДатаУстановки, ЗначениеУстановки.
Задача 1: Сделать запрос (соответственно можно из него сделать представление) для вычисления значения цены в заданный момент времени. Т.е. указав дату и код позиции, получить значение цены в этот день. Соответственно, если затребованный день будет позже последней даты установки, то последняя цена и будет являться текущей на это день.
Задача 2: Представим, что цена начинает действовать всегда с понедельника. Даже если цена была установлена в четверг, действовать она станет только на следующей неделе. Нужно сделать запрос (представление), который будет показывать значение цены у позиции по запрошенной неделе.
Доп. данные. Так как скорее всего (но не обязательно) может понадобиться доп. таблица типа календаря, где будут данные, содержащие
Дата, День недели, день месяца, День года
То можно считать что она есть. Хотя ее можно и съэмулировать.
Запрещено создавать временные глобальные и локальные таблицы, соответственно, никаких Delete, Insert, Update и т.д., просто Select и все.
Неделя всегда должна начинается с понедельника.
UPD:
Да, тут неприятность вышла. Данные нужно получить в виде
День, Значение, КодПозиции.
Запрос может возвращать и данные за период. Т.е. несколько дней. А не толко на какой-то опеределнный.
Т.е. можно написать Select * from <ваш запрос> where data between <data1> and <data2>
UPD::
Подчеркну еще раз. Запрос д.б. предствалением (но м.б. и вложенным). Т.е. в запросе не ограничивается дата и код, ограничивается это во внешнем запросе, или в звпросе, юзающего представление