2016-10-03 6 views
0

У меня есть SQLAnywhere стол, как это:SQL Накопительный последний непустой столбец значений

id  int   not null, 
inserted datetime not null, 
modified datetime not null, 
data1  varchar(20)  null 
data2  varchar(20)  null 

Разработчик не ставил уникальный индекс по идентификатору, и теперь есть куча строк с тем же id, но разные значения для данных1 и data2 по всем строкам, включая некоторые нули. Мне нужно исправить это, свернув все строки с одним и тем же идентификатором в отдельные строки в новой таблице, используя самое раннее вложенное время, последнее измененное время и последнее (по времени изменения) , не равное нулю значения данных1 и data2 (если все строки для этого идентификатора не имеют значения null, и в этом случае значение свернутой строки будет равно null). Я не могу использовать последнюю строку; Мне нужно последнее ненулевое значение для каждого отдельного столбца.

Так три ряда, как это:

1, '2016-01-01', '2016-01-02', 'first', null 
1, '2016-01-05', '2016-01-07', null, 'second' 
1, '2016-01-10', '2016-01-12', 'third', null 

... катался до:

1, '2016-01-01', 2016-01-12', 'third', 'second' 

Я смотрел, не равностепенной Самосоединения и функции оконная, но я не могут заставить их свернуть это последнее ненулевое значение для отдельных столбцов. Есть ли классный SQL-способ сделать это в одном запросе, или я, yikes, написав для него Java-программу?

Благодаря

ответ

0

Я хотел бы использовать LAST_VALUE.

select 
    id 
    ,min(inserted) over (partition by id) 
    ,max(modified) over (partition by id) 
    ,last_value(data1 ignore nulls) over (partition by id order by modified) 
    ,last_value(data2 ignore nulls) over (partition by id order by modified) 
from 
    table_a 
+0

Отлично! Спасибо Джереми. – alacrity