Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
401.64 Кб
Скачать

Задача. Вьюшка с аналитическими функциями по вкладам.

Дана таблица вкладчиков 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]