#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
Вы можете найти больше примеров на этом скриншоте:
Я создал курсор с циклом, но я не знаю, как проверить 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;