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

时间:2014-09-25 20:42:07

标签: function sql-server-2012

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

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]值的总和

The table before

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

我想要的结果如下图: The desired results

我是LAG函数/ OVER子句的新手,我想知道我是否遗漏了它。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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

你可以试试这个......

LAG(rtrim(ltrim([NC_GROUP])))OVER(分区按[NC_GROUP] 顺序由某个列定义此分区内记录的顺序

当您在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