Оконная функция аналитической функции
Столбец VAL представляет собой список номеров от 1 до 3, остальные столбцы должны отображать:
- A) MIN всех более низких значений, чем VAL
- B) MAX всех более низких значений, чем VAL
- C) MIN всех больших значений, чем VAL
- D) Макс всех больших значений, чем VAL
Я ожидаю этот результат:
V A B C D
-------------------
1 | | | 2 | 3
2 | 1 | 1 | 3 | 3
3 | 1 | 2 | |
Но результат, который я получаю:
V A B C D
-------------------
1 | | | 2 | 3
2 | | | |
3 | | | |
(*) Все пустые ячейки имеют нулевые результаты
Запрос, который я написал:
WITH T AS
(SELECT CAST(LEVEL AS NUMBER) val
FROM DUAL
CONNECT BY LEVEL < 4)
SELECT val
,MIN(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND val PRECEDING) A --MIN_PRECEDING
,MAX(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND val PRECEDING) B --MAX_PRECEDING
,MIN(val) OVER(ORDER BY val RANGE BETWEEN val FOLLOWING AND UNBOUNDED FOLLOWING) C --MIN_FOLLOWING
,MAX(val) OVER(ORDER BY val RANGE BETWEEN val FOLLOWING AND UNBOUNDED FOLLOWING) D --MAX_FOLLOWING
FROM T
WHERE val IS NOT NULL
ORDER BY 1
/
Кто-нибудь видит, что не так с этим запросом?
Заранее спасибо!
1 ответ
Решение
Ошибка в val preceding
а также val following
, Так должно быть 1 preceding
а также 1 following
,
Указанное вами число относится к текущей записи, запись соответствует значению val (в заданном порядке окна), поэтому, если вы укажете val
там вы идете назад (или впереди) слишком далеко. Вам нужно получить минимум / максимум до одной записи до (или после) текущей записи.
Так:
WITH T AS
(SELECT CAST(LEVEL AS NUMBER) val
FROM DUAL
CONNECT BY LEVEL < 4)
SELECT val
,MIN(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) A
,MAX(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) B
,MIN(val) OVER(ORDER BY val RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) C
,MAX(val) OVER(ORDER BY val RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) D
FROM T
WHERE val IS NOT NULL
ORDER BY 1
/