2013-08-07 10 views
0

SQL Server에서 작업하고 있습니다.누락 된 데이터 채우기

3/1/2013 aaa 7  5 
1/1/2013 bbb 1  2 
10/10/2012 ccc 5  8 
9/9/2012 ddd 6  9 
8/8/2012 bbb 2  3 

내가 "BBB"행에서 값을 위쪽 (날짜 별 순서)을 전파하고자하는 본질적으로 만들기 :

3/1/2013 aaa 1  2 
1/1/2013 bbb 1  2 
10/10/2012 ccc 2  3 
9/9/2012 ddd 2  3 
8/8/2012 bbb 2  3 

최고의 무엇 나는 다음과 같은 테이블이 있다고 가정 SQL Server에서이 작업을 수행하는 방법은 무엇입니까?

+0

업데이트 하시겠습니까? 아니면 그냥 선택 하시겠습니까? –

+0

그냥 선택하고 싶습니다 – Denis

+0

SQL Server 2008 R2를 사용하고 있습니다 – Denis

답변

2

뭔가 아주 기본적인이 될 수

SELECT MT.Date, MT.Text, 
     CASE WHEN MT.Text = 'bbb' THEN Number 
      ELSE (SELECT TOP 1 Number 
           FROM MyTable MT2 
           WHERE MT2.Date < MT.Date AND 
            MT2.Text = 'bbb' 
           ORDER BY MT2.Date DESC) 
      END Number, 
     CASE WHEN MT.Text = 'bbb' THEN Number2 
      ELSE (SELECT TOP 1 Number2 
           FROM MyTable MT2 
           WHERE MT2.Date < MT.Date AND 
            MT2.Text = 'bbb' 
           ORDER BY MT2.Date DESC) 
      END Number2 
     FROM MyTable MT 

SQLFiddle : http://sqlfiddle.com/#!3/cbee5/3

또는 OUTER APPLY이 (더 빨리해야한다)를 사용하여

SELECT MT.Date, MT.Text, 
     CASE WHEN MT.Text = 'bbb' THEN MT.Number 
      ELSE MT2.Number 
      END Number, 
     CASE WHEN MT.Text = 'bbb' THEN MT.Number2 
      ELSE MT2.Number2 
      END Number2 
     FROM MyTable MT 
     OUTER APPLY (SELECT TOP 1 MT2.Number, MT2.Number2 
           FROM MyTable MT2 
           WHERE MT.Text <> 'bbb' AND 
             MT2.Text = 'bbb' AND 
             MT2.Date < MT.Date 
           ORDER BY MT2.Date DESC 
        ) MT2 

SQLFiddle : http://sqlfiddle.com/#!3/cbee5/7

+0

LEFT JOIN으로 가능합니까? – Denis

+0

@Denis 당신은'CROSS APPLY'가 필요하다고 생각합니다. – xanatos

+0

@Denis 그러나 당신이 찾고있는 것은 아마 여기에 설명되어 있습니다 : http://stackoverflow.com/questions/7045040/replace-null-values-with-latest-non -null-value-in-resultset-series-sql-server-2 – xanatos

1

, 당신을 선택하려면 같이 간단하게 갈 수 있습니다.

SELECT t1.date, t1.tag, t2.val, t2.val2 
FROM Table1 t1 
JOIN Table1 t2 
    ON t2.tag='bbb' AND t1.date >= t2.date 
LEFT JOIN Table1 t3 ON t3.tag = 'bbb' AND t1.date >= t3.date AND t3.date > t2.date 
WHERE t3.date IS NULL 

An SQLfiddle to test with.

테이블 내용을 업데이트하면 거의 동일한 쿼리를 사용할 수 있습니다.

UPDATE t1 
SET val=t2.val, val2=t2.val2 
FROM Table1 t1 
JOIN Table1 t2 
    ON t2.tag='bbb' AND t1.date >= t2.date 
LEFT JOIN Table1 t3 ON t3.tag = 'bbb' AND t1.date >= t3.date AND t3.date > t2.date 
WHERE t3.date IS NULL 

Another SQLfiddle.

관련 문제