Function SQL Server-LAG(field1+;field2)函数提供不需要的结果

Function SQL Server-LAG(field1+;field2)函数提供不需要的结果,function,sql-server-2012,Function,Sql Server 2012,我正在尝试编写一个查询,该查询将保留前一条记录中两个字段的滚动总和。我当前的查询如下所示: SELECT [NC_GROUP] ,[NC_COVCAT] ,[NC_POST_DTE] ,[NC_GRP_SIZE] ,CASE WHEN (rtrim(ltrim([NC_GROUP])) LIKE LAG(rtrim(ltrim([NC_GROUP]))) OVER (order by [NC_GROUP], [NC_COVCAT] ) AND r

我正在尝试编写一个查询,该查询将保留前一条记录中两个字段的滚动总和。我当前的查询如下所示:

SELECT [NC_GROUP]
  ,[NC_COVCAT]
  ,[NC_POST_DTE]
  ,[NC_GRP_SIZE]
  ,CASE
        WHEN (rtrim(ltrim([NC_GROUP])) LIKE LAG(rtrim(ltrim([NC_GROUP]))) OVER (order by [NC_GROUP], [NC_COVCAT] ) 
        AND rtrim(ltrim([NC_COVCAT])) LIKE LAG(rtrim(ltrim([NC_COVCAT]))) OVER (order by [NC_GROUP], [NC_COVCAT] ))
        THEN
            LAG([NC_PREV_PD_PREM] + [NC_CURR_PD_PREM]) OVER (ORDER BY [NC_GROUP], [NC_COVCAT])
        ELSE
            [NC_PREV_PD_PREM]
   END [NC_PREV_PD_PREM]
  ,[NC_CURR_PD_PREM]
FROM [DBO].[Database]
order by [NC_GROUP], [NC_COVCAT]
该逻辑贯穿我的下表,检查当前记录是否与上一条记录具有相同的组和类别,然后将当前[NC_PREV_PD_PREM]设置为最后一条记录[NC_PREV_PD_PREM]和[NC_CURR_PD_PREM]值之和

我上面链接的查询给出了以下结果: 请注意,查询仅添加每个[NC\U GROUP]、[NC\U COVCAT]分组中的第二个条目。之后的记录没有使用相同的逻辑进行处理。我不确定如何继续

我期望的结果如下所示:


我不熟悉滞后函数/OVER子句,我想知道我是否遗漏了一些东西。非常感谢您的帮助。

我认为您没有使用Partition by子句,order by子句也不正确

你可以试试这个

滞后(rtrim(ltrim([NC_组]))超过(按[NC_组]划分)排序定义此分区内记录顺序的某列

当您在NC_GROUP和NC_COVCAT上进行分区时,您将始终得到NC_GROUP=Prev_NC_GROUP 和[NC_COVCAT]=[Prev_NC_COVCAT]

试试这个:

SELECT 
[NC_GROUP],[NC_COVCAT],[NC_POST_DTE],[NC_GRP_SIZE],
Case When [NC_GROUP]=[Prev_NC_GROUP] and [NC_COVCAT]=[Prev_NC_COVCAT] Then [Prev_NC_PREV_PD_PREM]+[Prev_NC_CURR_PD_PREM]
Else [NC_PREV_PD_PREM]
End as [NC_PREV_PD_PREM]
 FROM (
SELECT [NC_GROUP]
      ,[NC_COVCAT]
      ,[NC_POST_DTE]
      ,[NC_GRP_SIZE]
      ,LAG(rtrim(ltrim([NC_GROUP]))) OVER (Partition By [NC_GROUP], [NC_COVCAT] order by [id] ) [Prev_NC_GROUP]
      ,LAG(rtrim(ltrim([NC_COVCAT]))) OVER (Partition By [NC_GROUP], [NC_COVCAT] order by [id] ) [Prev_NC_COVCAT] 
      ,LAG([NC_PREV_PD_PREM]) OVER (Partition By [NC_GROUP], [NC_COVCAT] order by [id]) [Prev_NC_PREV_PD_PREM]
      ,LAG([NC_CURR_PD_PREM]) OVER (Partition By [NC_GROUP], [NC_COVCAT] order by [id]) [Prev_NC_CURR_PD_PREM]
      ,[NC_PREV_PD_PREM]
      ,[NC_CURR_PD_PREM]
FROM [DBO].[Database] ) X

我同意你对over的错误使用。我尝试了以下方法:
rtrim(ltrim([NC_COVCAT])类似于LAG(rtrim(ltrim([NC_COVCAT]))over(按[NC_组]划分,按[NC_组]、[NC_COVCAT]、[NC_covu FR_DT]、[NC_covu TO_DT)排序),得到了相同的结果。您是指when子句还是then?您在Order by子句中使用的列应该能够识别next或prev记录。我建议创建像id之类的唯一列,如果没有的话。然后按顺序使用,我创建了一个自动递增的ID列。我仍然没有让它工作,但我现在有这样的:
当(rtrim(ltrim([NC_-GROUP])像LAG(rtrim(ltrim([NC_-GROUP]))超过(按[NC_-COVCAT]顺序划分[NC_-GROUP])和rtrim(ltrim([NC_-COVCAT])像LAG(rtrim(ltrim([NC_-COVCAT]))超过(按[NC_-GROUP]顺序划分[NC_-cat])然后是LAG([NC_PREV_PD_PREM]+NC_CURR_PD_PREM)超过(按[NC_GROUP]划分,[NC_COVCAT]按[id]排序),否则[NC_PREV_PD_PREM]结束[NC_PREV_PD_PREM]
这非常接近,但计算不正确。它没有考虑更新“滚动”最后一行计算的合计。更新前一行后,我应该使用前一行的新金额,而不是原来的前一个已付金额