Программирование >>  Преобразование значений null 

1 ... 158 159 160 [ 161 ] 162 163 164 ... 219


просто трансформируйте решение в рефлексивное объединение и проверьте, какие строки будут участвовать в вычислениях. Рассмотрим результирующее множество ниже, которое аналогично результату, приведенному в разделе Решение :

select e.hiredate, e.sal,

sum(d.sal) as spending pattern from emp e, emp d where d.hiredate

between e.hiredate-90 and e.hiredate group by e.hiredate,e.sal order by 1

HIREDATE

SPENDING PATTERN

17-DEC-1980

20-FEB-1981

1600

2400

22-FEB-1981

1250

3650

02-APR-1981

2975

5825

01-MAY-1981

2850

8675

09-JUN-1981

2450

8275

08-SEP-1981

1500

1500

28-SEP-1981

1250

2750

17-NOV-1981

5000

7750

03-DEC-1981

11700

03-DEC-1981

3000

11700

23-JAN-1982

1300

10250

09-DEC-1982

3000

3000

12-JAN-1983

1100

4100

Если до сих пор остаются вопросы, уберите агрегацию и начните с получения декартова произведения. Первый шаг - используя таблицу EMP, создать декартово произведение, чтобы каждое значение HIREDATE можно было сравнивать со всеми другими значениями HIREDATE. (Ниже показан лишь фрагмент результирующего множества, потому что декартово произведение таблицы EMP включает 196 строк (14x14)

select e.hiredate, e.sal, d.sal, d.hiredate from emp e, emp d

HIREDATE

HIREDATE

17-DEC-1980

17-DEC-1980

17-DEC-1980

1600

20-FEB-1981

17-DEC-1980

1250

22-FEB-1981

17-DEC-1980

2975

02-APR-1981

17-DEC-1980

1250

28-SEP-1981

17-DEC-1980

2850

01-MAY-1981

17-DEC-1980

2450

09-JUN-1981



17-DEC-1980

3000

09-DEC-1982

17-DEC-1980

5000

17-NOV-1981

17-DEC-1980

1500

08-SEP-1981

17-DEC-1980

1100

12-JAN-1983

17-DEC-1980

03-DEC-1981

17-DEC-1980

3000

03-DEC-1981

17-DEC-1980

1300

23-JAN-1982

20-FEB-1981

1600

17-DEC-1980

20-FEB-1981

1600

1600

20-FEB-1981

20-FEB-1981

1600

1250

22-FEB-1981

20-FEB-1981

1600

2975

02-APR-1981

20-FEB-1981

1600

1250

28-SEP-1981

20-FEB-1981

1600

2850

01-MAY-1981

20-FEB-1981

1600

2450

09-JUN-1981

20-FEB-1981

1600

3000

09-DEC-1982

20-FEB-1981

1600

5000

17-NOV-1981

20-FEB-1981

1600

1500

08-SEP-1981

20-FEB-1981

1600

1100

12-JAN-1983

20-FEB-1981

1600

03-DEC-1981

20-FEB-1981

1600

3000

03-DEC-1981

20-FEB-1981

1600

1300

23-JAN-1982

Если проанализировать это результирующее множество, можно заметить, что нет даты HIREDATE, на 90 дней раньше или соответствующей 17 декабря, кроме 17 декабря. Таким образом, сумма для данной строки должна составлять всего 800. Если посмотреть на следующую HIRE-DATE, 20 февраля, можно увидеть, что только одно значение HIRE-DATE попадает в 90-дневное окно (предыдущие 90 дней), и это 17 декабря. Если сложить значения SAL для 17 декабря и 20 февраля (потому что мы ищем HIREDATE, равные рассматриваемой HIREDATE или попадающие в 90-дневное окно до нее), получаем 2400, что является окончательным результатом для этой даты.

Разобравшись с тем, что происходит, применяем фильтр в предикате WHERE, чтобы получить результаты для каждой HIREDATE и HIRE-DATE, равной ей или попадающей в 90-дневное окно до этой даты:

select e.hiredate, e.sal,

d.sal sal to sum,

d.hiredate within 90 days from emp e, emp d where d.hiredate

between e.hiredate-90 and e.hiredate order by 1

HIREDATE SAL SAL TO SUM WITHIN 90 DAYS

17-DEC-1980 800 800 17-DEC-1980

20-FEB-1981 1600 800 17-DEC-1980

20-FEB-1981 1600 1600 20-FEB-1981

22-FEB-1981 1250 800 17-DEC-1980



22-FEB-1981

1250

1600

20-FEB-1981

22-FEB-1981

1250

1250

22-FEB-1981

02-APR-1981

2975

1600

20-FEB-1981

02-APR-1981

2975

1250

22-FEB-1981

02-APR-1981

2975

2975

02-APR-1981

01-MAY-1981

2850

1600

20-FEB-1981

01-MAY-1981

2850

1250

22-FEB-1981

01-MAY-1981

2850

2975

02-APR-1981

01-MAY-1981

2850

2850

01-MAY-1981

09-JUN-1981

2450

2975

02-APR-1981

09-JUN-1981

2450

2850

01-MAY-1981

09-JUN-1981

2450

2450

09-JUN-1981

08-SEP-1981

1500

1500

08-SEP-1981

28-SEP-1981

1250

1500

08-SEP-1981

28-SEP-1981

1250

1250

28-SEP-1981

17-NOV-1981

5000

1500

08-SEP-1981

17-NOV-1981

5000

1250

28-SEP-1981

17-NOV-1981

5000

5000

17-NOV-1981

03-DEC-1981

1500

08-SEP-1981

03-DEC-1981

1250

28-SEP-1981

03-DEC-1981

5000

17-NOV-1981

03-DEC-1981

03-DEC-1981

03-DEC-1981

3000

03-DEC-1981

03-DEC-1981

3000

1500

08-SEP-1981

03-DEC-1981

3000

1250

28-SEP-1981

03-DEC-1981

3000

5000

17-NOV-1981

03-DEC-1981

3000

03-DEC-1981

03-DEC-1981

3000

3000

03-DEC-1981

23-JAN-1982

1300

5000

17-NOV-1981

23-JAN-1982

1300

03-DEC-1981

23-JAN-1982

1300

3000

03-DEC-1981

23-JAN-1982

1300

1300

23-JAN-1982

09-DEC-1982

3000

3000

09-DEC-1982

12-JAN-1983

1100

3000

09-DEC-1982

12-JAN-1983

1100

1100

12-JAN-1983

Теперь, зная, какие значения SAL должны войти в скользящее окно для вычисления суммы, просто применяем агрегатную функцию SUM для получения более выразительного результирующего множества:

select e. hiredate, e.sal,

sum(d.sal) as spending pattern from emp e, emp d where d. hiredate

between e.hiredate-90 and e.hiredate group by e.hiredate,e.sal order by 1

Если сравнить результирующее множество приведенного выше запроса и результирующее множество следующего запроса (который является первоначально предлагаемым решением), мы увидим, что они абсолютно одинаковые:



1 ... 158 159 160 [ 161 ] 162 163 164 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика