Как проверить max из диапазона в курсоре?

#sql #oracle #max #analytic-functions

#sql #Oracle #max #аналитические функции

Вопрос:

У меня проблема с переносом формулы Excel в SQL. Моя формула Excel такова: =IF(P2<(MAX($P$2:P2));"Move";"") . Столбец P в Excel представляет собой последовательность чисел.

 a | b 
------
1   
2   
7   
3   MOVE
4   MOVE
8   
9
5   MOVE
10
  

Вы можете найти больше примеров на этом скриншоте:

Скриншот Excel

Я создал курсор с циклом, но я не знаю, как проверить max из диапазона. Например, когда я выполняю итерацию для четвертой строки, я должен проверить max из 1-4 строк и т.д.

Ответ №1:

Нет необходимости в курсоре и цикле. Предполагая, что у вас есть столбец, который определяет порядок строк (скажем, id ), вы можете использовать оконные функции:

 select t.*,
    case when a < max(a) over(order by id) then 'MOVE' end as b
from mytable t
  

Ответ №2:

Одним из вариантов может быть использование MAX() аналитической функции. Но в любом случае у вас будет дополнительный столбец, например, id для упорядочения, чтобы определить максимальное значение для текущей строки из первой строки, поскольку операторы SQL представляют неупорядоченные наборы. Если у вас есть этот id столбец со значениями, упорядоченными как в вашем примере данных, тогда рассмотрите возможность использования

 WITH t2 AS
(
SELECT MAX(a) OVER (ORDER BY id ROWS BETWEEN
                                UNBOUNDED PRECEDING
                                AND
                                CURRENT ROW) AS max_upto_this_row, 
       t.*
  FROM t
)
SELECT a, CASE WHEN max_upto_this_row > a THEN 'Move' END AS b
  FROM t2
 ORDER BY id;
  

Demo