如何检查光标范围内的最大值?

问题描述

我在将Excel公式转换为sql时遇到问题。我的excel公式是:=IF(P2<(MAX($P$2:P2));"Move";"")。 excel中的P列是一个数字序列。

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

您可以在此屏幕截图上找到更多示例:

Excel screenshot

我创建了一个带有循环的游标,但是我不知道如何从范围检查最大值。 例如,当我迭代第四行时,我必须检查1-4行中的最大值,等等。

解决方法

不需要游标和循环。假设您有一列定义行的顺序(例如 id),则可以使用窗口函数:

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

一个选择是使用MAX()解析函数。但是无论如何,由于SQL语句表示无序集,因此您将有一个额外的列,例如id,以便确定第一行中当前行的最大值。如果您有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