
- •Введение.
- •Соединение с бд Oracle.
- •Типы данных Oracle, создание и модификация таблиц и вьюшек.
- •Задача. Удаление дубликатов.
- •Задача. Удаление по условию not in.
- •Функции по работе со строками.
- •Функции по работе с числами.
- •Троичная логика, конструкция with, функции nvl, coalesce, case, decode.
- •Основы pl/sql.
- •Задача. Факториал.
- •Задача. Подсчет числа вхождений символа в строку.
- •Задача. Подсчет числа вхождений подстроки в строку.
- •Задача. Копирование таблицы фиксированной структуры.
- •Задача. Простановка count в цикле.
- •Задача. Распределение данных по условию.
- •Задача. Использование сиквенсов и dbms_random.
- •Задача. Процедура с out параметрами. Нотации.
- •Задача. Простой пакет.
- •Задача. Разные виды Count.
- •Задача. Получение скрипта заполнения таблицы имеющимися данными.
- •Раздача прав (grants).
- •Операции над множествами, joins.
- •Задача. Сравнение множеств.
- •Задача. Загрузка данных с помощью full join.
- •Задача. Проставление роста животных.
- •Оператор merge.
- •Задача. Merge данных о студентах.
- •Задача. Merge данных о клиентах.
- •Функции по работе с датами.
- •Словарь данных.
- •Задача. Last_ddl_time.
- •Задача. Отчет об объектах текущей схемы.
- •Задача. Dbms_output из явного курсора по словарю данных.
- •Задача. Компиляция схемы.
- •Задача. Поиск текста во вьюшках.
- •Динамический sql.
- •Задача. Удаление конкретной таблицы, если она существует.
- •Задача. Удаление любой таблицы с проверкой на существование.
- •Задача. Конструкция '%rowcount'.
- •1) С помощью динамического вызова команды truncate очистить таблицу kk_objects_list от данных.
- •3) Вставить в таблицу kk_objects_list перечень имен всех объектов текущей схемы. С помощью конструкции sql%rowcount выдать в dbms_output количество вставившихся строк.
- •Задача. Удаление всех таблиц и вьюшек.
- •Часть 1. Написать pl/sql блок, который дропает все таблицы текущей схемы, начинающиеся на 'kk_'.
- •Часть 2. Написать pl/sql блок, который выдает в dbms_output скрипт удаления всех вьюшек текущей схемы, начинающихся с 'vw_kk%'.
- •Задача. Отчет о максимальных id.
- •Задача. Переименование столбцов.
- •Задача. Создание вьюшек.
- •Триггеры.
- •Задача. Автоинкрементное поле.
- •Задача. Триггер конвертации сумм в валюте.
- •Задача. Триггер логирования dml-операций.
- •Задача. Триггер зеркалирования.
- •Задача. Триггер по поиску в справочнике.
- •Задача. Триггер контроля.
- •Global temporary tables и переменные в заголовке пакета.
- •Переменные в заголовке пакета.
- •Регулярные выражения.
- •Задача. Правка некачественных данных регулярными выражениями.
- •Задача. Парсинг строк с помощью регулярных выражений.
- •Автономные транзакции.
- •Задача. Автономное логирование этапов загрузки.
- •Иерархические запросы.
- •Задача. Вывод иерархии с отступами.
- •Задача. Соединение иерархической таблицы с обычной.
- •Задача. Сумма зарплат подчиненных.
- •Задача. Простой календарь.
- •Задача. Детальный календарь.
- •Задача. Календарь с индикаторами выходных дней.
- •Аналитические функции.
- •Отступление о Rownum.
- •Негрупповые аналитические функции.
- •Групповая функция keep dense_rank.
- •Задача. Взятие последней записи о клиенте.
- •Задача. Отчет об изменениях зарплаты.
- •Задача. Пакет функций о вкладах.
- •Задача. Группировка лога выполнения процессов.
- •Задача. Вьюшка с аналитическими функциями по вкладам.
- •Задача. Календарь с аналитикой.
- •Задача. Поиск баланса счета на заданную дату.
- •Задача. Удаление исторических данных о рейтинге.
- •Функции, выдающие более одного значения.
- •Задача. Вызов многозначной функции.
- •"Расклейка" и "склейка" строк.
- •“Расклейка” одной строки.
- •“Расклейка” нескольких строк с группировкой.
- •“Склейка” в одну строку.
- •“Склейка” нескольких строк с группировкой.
- •Задача. Простая расклейка-склейка.
- •Задача. Скрипт создания индексов.
- •Задача. Скрипт создания таблиц.
- •Задача. Отчет о созданных объектах.
- •Задача. Отчет о числе строк в таблицах.
- •Задача. Расклейка списка хобби.
- •Задача. Склейка запроса о максимумах числовых полей.
- •Оптимизация запросов.
Задача. Вьюшка с аналитическими функциями по вкладам.
Дана таблица вкладчиков KK_DEPOSIT из задачи "Пакет функций о вкладах".
Написать вьюшку по таблице KK_DEPOSIT с группировкой по CLIENT_NAME и с полями:
CLIENT_NAME
число дней от открытия первого вклада до сегодняшнего дня
список DEPOSIT_ID через запятую
дата последнего вклада
сумма последнего вклада
сумма предпоследнего вклада(если есть)
Создадим требуемую вьюшку. Во внутреннем подзапросе вычислим сумму предыдущего вклада - таким образом, сумма предпоследнего вклада будет доступна в строке с максимальным DT для каждого CLIENT_NAME:
CREATE OR REPLACE VIEW VW_KK_DEPOSIT AS
SELECT CLIENT_NAME,
TRUNC(SYSDATE - MIN(DT)) FIRST_DEPOSIT_LENGTH_IN_DAYS,
WM_CONCAT(DEPOSIT_ID) DEPOSIT_ID_LIST,
MAX(DT) LAST_DEPOSIT_DATE,
MAX(AMOUNT) KEEP(DENSE_RANK LAST ORDER BY DT) LAST_DEPOSIT_AMOUNT,
MAX(PREVIOUS_AMOUNT) KEEP(DENSE_RANK LAST ORDER BY DT) PENULTIMATE_DEPOSIT_AMOUNT
FROM (SELECT DEPOSIT_ID,
CLIENT_NAME,
DT,
AMOUNT,
LAG(AMOUNT) OVER(PARTITION BY CLIENT_NAME ORDER BY DT) PREVIOUS_AMOUNT
FROM KK_DEPOSIT)
GROUP BY CLIENT_NAME;
О функции WM_CONCAT будет подробнее рассказано в главе «“Расклейка” и “склейка” строк».
Здесь заметим, что для WM_CONCAT не получается указать условие на сортировку DEPOSIT_ID. Если такая сортировка потребуется, то нужно будет использовать SYS_CONNECT_BY_PATH.
Проверим результат:
SELECT * FROM VW_KK_DEPOSIT;
Задача. Календарь с аналитикой.
Используя таблицу kk_holidays_list из задачи "Календарь с индикаторами выходных дней", написать запрос, выдающий календарь на 2012 год со следующими полями:
- дата
- является ли эта дата выходным днем
- последний выходной день, который предшествовал этой дате
- сколько было выходных дней с начала года до этой даты включительно
- сколько всего выходных дней в месяце, к которому относится эта дата
В иерархическом подзапросе q1 составим простой календарь на 2012 год.
В подзапросе q2 добавим вспомогательные поля - номер месяца (month_num), является ли день выходным (is_holiday) и предыдущий выходной день (lag_operdate), который получается содержащим NULLs.
Во внешнем запосе уберем эти NULLs с помощью last_value, а также используем два варианта оператора sum over - берем сумму с нарастающим итогом за год и общую сумму за каждый месяц:
select dt,
is_holiday,
last_value(lag_operdate ignore nulls) over(order by dt) previous_holiday,
sum(is_holiday) over(order by dt) holidays_since_2012_start,
sum(is_holiday) over(partition by month_num) holidays_during_month
from (select q1.dt,
h.operdate,
to_char(q1.dt, 'mm') month_num,
decode(h.operdate, null, '0', '1') is_holiday,
lag(h.operdate) over(order by q1.dt) lag_operdate
from (select to_date('31.12.2011', 'dd.mm.yyyy') + level dt
from dual
connect by level <= 366) q1
left join kk_holidays_list h
on q1.dt = h.operdate) q2
order by dt;