gpt4 book ai didi

sql - 如何从多列中检索 "last"非零值?

转载 作者:行者123 更新时间:2023-12-03 00:29:39 25 4
gpt4 key购买 nike

考虑一个包含 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com