作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑一个包含 11 列的有序表:时间跨度、val1、val2、val3、val4、val5、val6、val7、val8、val9 和 val10
假设一组记录如下:
timespan val1 val2 val3 val4 val5 val6 val7 val8 val9 val10
10/09/2011 0 0 60 80 40 0 0 40 80 0
10/10/2011 0 10 90 30 70 50 50 70 30 90
10/11/2011 10 0 20 0 0 60 60 0 0 20
我需要一个 SQL 查询(对于 SQL Server 2012),它返回所有列 val1、val2 等最后一个(及时)非零值,即,
val1 val2 val3 val4 val5 val6 val7 val8 val9 val10
10 10 20 30 70 60 60 70 30 20
类似的问题可以在 Subquery: how to retrieve the last non-zero value from a column? 找到但它仅适用于一列,并且泛化到包含更多列(如本例所示)似乎不切实际。
最佳答案
您可以使用first_value()
:
select distinct first_value(val1) over (order by sign(val1) desc, timespan desc) as val1,
first_value(val2) over (order by sign(val2) desc, timespan desc) as val2,
. . .
from t;
一般来说,我反对使用 select unique
作为聚合查询的替代品。不幸的是,SQL Server 支持 first_value()
作为窗口函数,但不提供等效的聚合函数。
注意:sign()
函数用于将零值放在最后。如果可以有负值,请使用 abs(sign())
。
关于sql - 如何从多列中检索 "last"非零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689799/
我是一名优秀的程序员,十分优秀!