Оконная функция аналитической функции

Столбец 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
/
Другие вопросы по тегам