замените значения NULL последними значениями, отличными от NULL в серии наборов результатов (SQL Server 2008 R2)

для SQL Server 2008 R2

У меня есть набор результатов, который выглядит следующим образом (примечание [цена] является числовым, 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)

Но я, похоже, не нахожу никакого способа сделать "совокупное последнее ненулевое значение" в окне (чтобы привязать окно к предыдущим строкам, а не ко всему разделу)

Помимо создания определяемой пользователем функции, возвращающей табличное значение, есть ли какая-нибудь встроенная функция, которая могла бы выполнить это?


ОБНОВЛЕНИЕ:

По-видимому, эта функция доступна в CTP 'Denali', но не в 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

7
задан spencer7593 12 August 2011 в 19:34
поделиться