sql-server – 用结果集系列中的最新非NULL值替换NULL值(SQL Ser
对于SQL Server 2008 R2
我有一个看起来像这样的结果集(注意[price]是数字,下面的NULL代表一个 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |