我正在尝试编写一个查询,该查询将保留前一条记录中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]值的总和
我上面链接的查询给出了以下结果: 请注意,查询仅为每个[NC_GROUP],[NC_COVCAT]分组中的第二个条目添加。之后的记录没有使用相同的逻辑进行处理。我不确定如何继续。
我想要的结果如下图:
我是LAG函数/ OVER子句的新手,我想知道我是否遗漏了它。非常感谢任何帮助。
答案 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