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

Posted

技术标签:

【中文标题】如何检查光标范围内的最大值?【英文标题】:How to check max from range in cursor? 【发布时间】:2020-11-05 19:56:20 【问题描述】:

我在将 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 行等的最大值。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

一种选择是使用MAX() Analytic function 。但是在任何情况下,您都会有一个额外的列,例如 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

【讨论】:

以上是关于如何检查光标范围内的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL在where语句中使用日期范围的选择子查询来确定该日期范围内的最大值

如何更改名称在值范围内的有序列组?

在VB中,如何生成某个范围内的随机整数?

查询返回日期范围内的行,但只返回列的最大值

Mysql查询,范围内的最大值和最小值没有得到正确的输出

如何使用模板来规范化 0 到 1 范围内的数字?