问题描述
我在将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
您可以在此屏幕截图上找到更多示例:
我创建了一个带有循环的游标,但是我不知道如何从范围检查最大值。 例如,当我迭代第四行时,我必须检查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;