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

本教程将介绍用结果集系列中的最新非 NULL 值替换 NULL 值(SQL Server 2008 R2)的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

用结果集系列中的最新非 NULL 值替换 NULL 值(SQL Server 2008 R2) 教程 第1张

问题描述

对于 SQL Server 2008 R2

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

product timestamp price 
------- ---------------------
5678 2008-01-01 12:0012.34
5678 2008-01-01 12:01 NULL
5678 2008-01-01 12:02 NULL
5678 2008-01-01 12:0323.45
5678 2008-01-01 12:04 NULL

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

product timestamp price------- ---------------------
5678 2008-01-01 12:0012.34
5678 2008-01-01 12:0112.34
5678 2008-01-01 12:0212.34
5678 2008-01-01 12:0323.45
5678 2008-01-01 12:0423.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 中使用局部变量执行类似的操作.

推荐答案

您可以尝试以下方法:

* 更新**

-- 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', NULL
UNION ALL
SELECT 5678, '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 TimestampPrice
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

好了关于用结果集系列中的最新非 NULL 值替换 NULL 值(SQL Server 2008 R2)的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。