2015-03-17 2 views
0

У меня есть эта таблица:добавить столбец на основе значения столбца

PersonID DateKey C/L 
    1  20140903 8 
    1  20140904 null 
    1  20140906 10 
    1  20140908 null 
    2  20140903 18 
    2  20140904 null 
    2  20140906 30 
    2  20140908 null 

мне нужно добавить еще один столбец и повторить значение [C/L] результирующая таблица должна быть, как показано ниже:

PersonID DateKey C/L  C/L_New 
    1  20140903 8   8 
    1  20140904 null  8 
    1  20140906 10   10 
    1  20140908 null  10 
    2  20140903 18   18 
    2  20140904 null  18 
    2  20140906 30   30 
    2  20140908 null  30 
+1

Что такое шаблон здесь? –

ответ

2

Я думаю, вы хотите, чтобы это (предполагая, DateKey это дата или столбец даты и времени):

SELECT PersonID,  
     DateKey, 
     [C/L], 
     [C/L_New] = ISNULL([C/L], (SELECT TOP 1 t2.[C/L] 
            FROM dbo.TableName t2 
            WHERE t2.PersonID = t.PersonID 
            AND t2.DateKey <= t.DateKey 
            AND t2.[C/L] IS NOT NULL 
            ORDER BY DateKey DESC)) 
FROM dbo.TableName t 
Order By PersonID, DateKey 

Edit: DEMO

1

I предположим, что вы хотите получить значение из предыдущей строки, если значение текущей строки равно NULL.

От SQL Server 2012 вы можете использовать LAG функцию:

SELECT PersonID 
     ,DateKey 
     ,[C/L] 
     ,COALESCE([C/L], LAG([C/L], 1, NULL) OVER (ORDER BY PersonID, DateKey)) AS [C/L_New] 
FROM YourTable 
+0

Может понадобиться 'OVER (PARTITION BY PersonID ORDER BY DateKey)'. –

+0

@BaconBits работает, спасибо. – dario

+0

Да, вы не можете получить желаемые результаты, если у первой записи для человека есть 'NULL' для' C/L'. Он вытащит последний 'C/L' предыдущего человека. Это, вероятно, не имеет смысла. –

Смежные вопросы