假设我有一个表,如下所示:

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.010,很可能是数据处理错误,所以我想用最后一个非0.01或非0的值覆盖它们,然后用JOIN来更新表.我相信这需要我首先提出LAG(Volume)列,但我需要LAG()函数来忽略一些值.在我的示例中,它们将是0.010.我想,也可以说,我希望滞后值取决于滞后值实际是什么.换句话说,对于我的示例,我希望生成以下表格:

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的值,而不必创建中间滞后列,也请让我知道.

如有建议,我们将不胜感激!

推荐答案

在早期版本中,您可以使用串联方法来模拟IGNORE NULLS.2016 DB Fiddle.

它使用MAX,窗口为ORDER BY [Row] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING

假设Row是一个正整数,进入MAX的值是RowVolume的串联,这样后面的Row个数字就是MAX--但在您想要忽略的情况下,这些数字会被清空,而MAX会自动忽略这些数字.

然后,Volume被提取出来,SUBSTRINGCAST返回到decimal-如果您实际上没有使用decimal(12,2),那么将其更改为您使用的are.

SELECT 
 *,
 CAST(SUBSTRING(MAX(RIGHT(CONCAT('0000000000', [Row]),10) + CASE WHEN Volume > 0.01 THEN CAST(Volume AS VARCHAR(20)) END) OVER (ORDER BY [Row] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 11, 20) AS decimal(12,2))
FROM YourTable

Sql相关问答推荐

如何重用表值用户定义函数调用的结果?

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

如何在Presto中将多个列合并到一个数组中

如何更新SQLite数据库中的表?

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

如何在presto中映射id与名称

根据时间、状态和相关行在PostgreSQL中的存在来删除行

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

如何在T-SQL中编写row_number的WHERE子句?

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

使用长 IN 子句的 SQL 优化

如何使用SQL将患者平均分配给他们所在地区的doctor

带聚合函数的 percentile_cont

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

使用其他表 SUM 的交换价格转换价格并获得 AVG

SQL查询以获取从特定可变日期看到的用户

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

包含多行的 SQL 查询