|
Программирование >> Преобразование значений null
просто трансформируйте решение в рефлексивное объединение и проверьте, какие строки будут участвовать в вычислениях. Рассмотрим результирующее множество ниже, которое аналогично результату, приведенному в разделе Решение : 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
Если до сих пор остаются вопросы, уберите агрегацию и начните с получения декартова произведения. Первый шаг - используя таблицу EMP, создать декартово произведение, чтобы каждое значение HIREDATE можно было сравнивать со всеми другими значениями HIREDATE. (Ниже показан лишь фрагмент результирующего множества, потому что декартово произведение таблицы EMP включает 196 строк (14x14) select e.hiredate, e.sal, d.sal, d.hiredate from emp e, emp d
Если проанализировать это результирующее множество, можно заметить, что нет даты 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
Теперь, зная, какие значения 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 Если сравнить результирующее множество приведенного выше запроса и результирующее множество следующего запроса (который является первоначально предлагаемым решением), мы увидим, что они абсолютно одинаковые:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |