重复检查同一列中的最大值并替换为新找到的最大值

时间:2017-01-20 16:46:00

标签: sql sql-server max sql-server-2014

我正在尝试查找列中的最大值并保持相同的值,直到找到下一个最大值,如果找到则将其替换为新的,在SQL中,因为数据位于MS SQL Server中

算法基本上是为MaxDelay保留一个全局变量,并继续用新的max重写,或者用'for loops'重写一个用于当前行,另一个用于第1行,直到找到下一个项目。

我应该在SQL中使用混合的递归查询和功能吗? 我尝试了Lag()但由于窗口函数限制,我无法使用Lag()的Max()。

SELECT *,
(select max(v) from (VALUES([Delay],Lag([Delay], 1) OVER(ORDER BY [Milestones], [Project Name])))as value(v)) as [MaxDate]
FROM dbo.[Scenario Testing with Previous Row]

错误:

  

Msg 4108,Level 15,State 1,Line 2   窗口函数只能出现在SELECT或ORDER BY子句中。

如果有人能给我一些指示,我将不胜感激。

Project Name    Milestones  Baseline Date   Actual Date Delay   Max Delay     Worst Case Date
Project 1   MS_1    12/12/2016  15/12/2016  3   3   15/12/2016
Project 1   MS_2    14/12/2016  16/12/2016  2   3   17/12/2016
Project 1   MS_3    31/12/2016  09/01/2017  9   9   09/01/2017
Project 1   MS_4    11/01/2017  12/01/2017  1   9   20/01/2017
Project 1   MS_5    21/01/2017  24/01/2017  3   9   30/01/2017
Project 1   MS_6    01/02/2017  15/02/2017  14  14  15/02/2017
Project 1   MS_7    15/02/2017  16/02/2017  1   14  01/03/2017
Project 1   MS_8    26/02/2017  26/02/2017  0   14  12/03/2017
Project 1   MS_9    31/03/2017  31/03/2017  0   14  14/04/2017

1 个答案:

答案 0 :(得分:3)

如果您想要累计最大值,请使用相应的函数。像这样:

select t.*,
       max(delay) over (order by [Milestones], [Project Name]) as running_max
from dbo.[Scenario Testing with Previous Row] t;