假设我有一个如下表:
Row Volume
1 10000
2 8000
3 0.01
4 0
5 5000
6 0
现在,如果我在 SQL Server 中使用
LAG()
函数,我相信会得到下表:
Row Volume LAG(Volume)
1 10000 NULL
2 8000 10000
3 0.01 8000
4 0 0.01
5 5000 0
6 0 5000
现在请允许我提供一些背景知识来解释为什么我需要
LAG(Volume)
列。原因是因为小值,例如我的示例中的 0.01
或 0
,很可能是数据处理错误,所以我想用最后一个非 0.01
或非 0
覆盖它们值,然后通过 JOIN
更新表格。我相信这需要我首先提出 LAG(Volume)
列,但我需要 LAG()
函数来忽略某些值。在我的示例中,它们是 0.01
和 0
。我想,人们也可以说我希望滞后值取决于滞后值的实际值。换句话说,我希望生成下表:
Row Volume LAG(Volume)
1 10000 NULL
2 8000 10000
3 0.01 8000
4 0 8000
5 5000 8000
6 0 5000
请注意,对于第 6 行,滞后应为 5000(而不是 8000),因为尽管其交易量为 0,但其滞后既不是 0 也不是 0.01。
这可以吗?
也许如果有人有其他方法可以将这些值更新为最后一个非
0.01
或非0
值,而无需创建中间滞后列,也请告诉我。
任何建议将不胜感激!
假设您使用的是最新版本的 SQL Server(因为没有提及您不是),您可以使用
CASE
表达式来使 NULL
值低于 n(我假设为 1
)并且然后告诉 LAG
到 IGNORE NULLS
s:
LAG (CASE WHEN Volume > 1 THEN Volume END) IGNORE NULLS OVER (ORDER BY [Row]) AS LagVolumn
一种简单的方法是通过子查询中的相关性来实现逻辑:
select *, (
select top (1) volume from t t2
where t2.[row] < t.[row] and t2.volume > 1
order by [row] desc
) as Lag_Volume
from t
order by Id;