是否可以在 SQL Server 中使用 LAG,并指定要采用的 LAG 值的特定条件?

问题描述 投票:0回答:2

假设我有一个如下表:

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 sql-server window-functions
2个回答
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

db<>小提琴


0
投票

一种简单的方法是通过子查询中的相关性来实现逻辑:

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;
© www.soinside.com 2019 - 2024. All rights reserved.