我正在使用SQL Server 2012並具有如下所示的值的表格。它填充了事件數據。使用SQL Server 2012的Last_Value()函數時忽略空值
FldType Date Price Size
--------------------------------------------
2 2012-08-22 00:02:01 9140 1048
0 2012-08-22 00:02:02 9140 77
1 2012-08-22 00:02:03 9150 281
2 2012-08-22 00:02:04 9140 1090
0 2012-08-22 00:02:05 9150 1
1 2012-08-22 00:02:06 9150 324
2 2012-08-22 00:02:07 9140 1063
我想跟蹤最新的值對每個3種字段類型(0,1,2),以使最終的輸出如下所示。
Date Price0 Size0 Price1 Size1 Price2 Size2
-----------------------------------------------------------------
2012-08-22 00:02:01 NULL NULL NULL NULL 9140 1048
2012-08-22 00:02:02 9140 77 NULL NULL 9140 1048
2012-08-22 00:02:03 9140 77 9150 281 9140 1048
2012-08-22 00:02:04 9140 77 9150 281 9140 1090
2012-08-22 00:02:05 9150 1 9150 281 9140 1090
2012-08-22 00:02:06 9150 1 9150 324 9140 1090
2012-08-22 00:02:07 9150 1 9150 324 9140 1063
不幸的是,它不忽略後續的空值,所以我得到了這個。
Date Price0 Size0 Price1 Size1 Price2 Size2
-----------------------------------------------------------------
2012-08-22 00:02:01 NULL NULL NULL NULL 9140 1048
2012-08-22 00:02:02 9140 77 NULL NULL NULL NULL
2012-08-22 00:02:03 NULL NULL 9150 281 NULL NULL
2012-08-22 00:02:04 NULL NULL NULL NULL 9140 1090
2012-08-22 00:02:05 9150 1 NULL NULL NULL NULL
2012-08-22 00:02:06 NULL NULL 9150 324 NULL NULL
2012-08-22 00:02:07 NULL NULL NULL NULL 9140 1063
我當前的查詢看起來像這樣
SELECT [Date],
LAST_VALUE(Price0) OVER (PARTITION BY FldType ORDER BY [Date]) AS Price0,
LAST_VALUE(Size0) OVER (PARTITION BY FldType ORDER BY [Date]) AS Size0,
LAST_VALUE(Price1) OVER (PARTITION BY FldType ORDER BY [Date]) AS Price1,
LAST_VALUE(Size1) OVER (PARTITION BY FldType ORDER BY [Date]) AS Size1,
LAST_VALUE(Price2) OVER (PARTITION BY FldType ORDER BY [Date]) AS Price2,
LAST_VALUE(Size2) OVER (PARTITION BY FldType ORDER BY [Date]) AS Size2
FROM (
SELECT FldType, [Date], Price, Size,
CASE WHEN FldType = 0 THEN Price END as Price0,
CASE WHEN FldType = 0 THEN Size END as Size0,
CASE WHEN FldType = 1 THEN Price END as Price1,
CASE WHEN FldType = 1 THEN Size END as Size1,
CASE WHEN FldType = 2 THEN Price END as Price2,
CASE WHEN FldType = 2 THEN Size END as Size2
FROM [RawData].[dbo].[Events]
) as T1
ORDER BY [Date]
是否有某種方式有SQL Server 2012的確定最新的值時忽略空值?或者有更好的方法不使用函數?
總結我試圖實現兩件事。
- 拆分的
Price
和Size
列到6列(2列×3字段類型) - 跟蹤在每個這些列的最新值的。
任何建議將apprciated。
** SQL ** =結構化的查詢語言,本身就是語言; ** SQL 2012 ** = 2012年的SQL語言標準(不一致); SQL ** Server ** 2012 = 2012版微軟** SQL Server **產品 – 2013-02-19 09:25:16
@marc_S好點!感謝您的改變! – 2013-02-19 09:27:50
編輯標題明確表示它是SQL Server 2012.這是重要的區別,因爲1)Oracle的SQL確實有一個忽略空值選項,並且2)在SQL Server 2012中有'ROWS'和'RANGE'選項可能有些用於尋找解決方案 – 2013-02-19 10:03:04