gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:37:27 27 4
gpt4 key购买 nike

对于 SQL Server 2008 R2

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

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)

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

除了创建表值用户定义函数之外,是否有任何内置函数可以完成此任务?

<小时/>

更新:

显然,此功能在“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', 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 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

关于sql-server - 将 NULL 值替换为结果集系列中最新的非 NULL 值 (SQL Server 2008 R2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045040/

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