sql-server – 用结果集系列中的最新非NULL值替换NULL值(SQL Server 2008 R2)

前端之家收集整理的这篇文章主要介绍了sql-server – 用结果集系列中的最新非NULL值替换NULL值(SQL Server 2008 R2)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于sql Server 2008 R2

我有一个看起来像这样的结果集(注意[price]是数字,下面的NULL代表一个
NULL值,结果集按product_id和timestamp排序)

product timestamp          price 
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01    NULL
   5678 2008-01-01 12:02    NULL
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04    NULL

我想将其转换为(基本上)从最新的前一行复制非空值的结果集,以生成如下所示的结果集:

product timestamp          price  
------- ----------------   -----
   5678 2008-01-01 12:00   12.34
   5678 2008-01-01 12:01   12.34
   5678 2008-01-01 12:02   12.34
   5678 2008-01-01 12:03   23.45
   5678 2008-01-01 12:04   23.45

我没有找到任何允许我这样做的聚合/窗口函数(再次这只是sql Server 2008 R2所需要的.)

我希望找到一个分析聚合函数来为我做这个,比如…

LAST_VALUE(price) OVER (PARTITION BY product_id ORDER BY timestamp)

但我似乎没有找到任何方法在窗口中执行“累积最新的非空值”(将窗口绑定到前面的行,而不是整个分区)

除了创建表值用户定义函数之外,是否有任何内置函数可以实现此目的?

更新:

显然,此功能在“Denali”CTP中可用,但在sql Server 2008 R2中不可用.

LAST_VALUE http://msdn.microsoft.com/en-us/library/hh231517%28v=SQL.110%29.aspx

我只是期望它可以在sql Server 2008中使用.它可以在Oracle中使用(至少10gR2),我可以在MysqL 5.1中使用局部变量做类似的事情.

http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions083.htm

解决方法

您可以尝试以下方法

* 更新 **

-- Test Data
DECLARE @YourTable TABLE(Product INT,Timestamp DATETIME,Price NUMERIC(16,4))

INSERT INTO @YourTable
SELECT 5678,'20080101 12:00:00',12.34
UNION ALL
SELECT 5678,'20080101 12:01:00',NULL
UNION ALL
SELECT 5678,'20080101 12:02:00','20080101 12:03:00',23.45
UNION ALL
SELECT 5678,'20080101 12:04:00',NULL

;WITH CTE AS
(
    SELECT *
    FROM @YourTable
)

-- Query
SELECT A.Product,A.Timestamp,ISNULL(A.Price,B.Price) Price
FROM CTE A
OUTER APPLY (   SELECT TOP 1 *
                FROM CTE 
                WHERE Product = A.Product AND Timestamp < A.Timestamp
                AND Price IS NOT NULL
                ORDER BY Product,Timestamp DESC) B

--Results
Product Timestamp   Price
5678    2008-01-01 12:00:00.000 12.3400
5678    2008-01-01 12:01:00.000 12.3400
5678    2008-01-01 12:02:00.000 12.3400
5678    2008-01-01 12:03:00.000 23.4500
5678    2008-01-01 12:04:00.000 23.4500
原文链接:https://www.f2er.com/mssql/77552.html

猜你在找的MsSQL相关文章