2014-04-30 2 views
2

이 테이블 (테스트)를 고려 마지막으로 사용 가능한 행에서 그리고 OtherTable - 즉에서 채워 져야합니다. C1은 같은 값을 가지며 C2는 OtherTable에서 나오고 Data는 같은 값을가집니다.이전 행에서 누락 된 값을 작성하는 방법

C1 C2 Data 
---------------- 
1 101 A1 
1 102 A1 -- <<< Filled in from OtherTable & last available row 'A1' 
1 103 A1 -- <<< Filled in from OtherTable & last available row 'A1' 
1 104 A4 
1 105 A5 
2 101 B1 
2 102 B2 
2 103 B3 
2 104 B3 -- <<< Filled in from OtherTable & last available row 'B3' 
2 105 B5 

나는이 내장했습니다

WITH Keys AS 
(
    SELECT 
     T.C1, 
     O.C2 
    FROM 
     TEST T 
     CROSS APPLY (SELECT C2 FROM OtherTable) O 
    GROUP BY 
     T.C1, 
     O.C2 
), 
MaxMin AS 
(
    SELECT 
     C1, 
     MIN(C2) LowerBound, 
     MAX(C2) UpperBound 
    FROM 
     Test 
    GROUP BY 
     C1 
) 
SELECT 
    K.C1, 
    K.C2, 
    T.Data 
FROM 
    Keys K 
    LEFT JOIN Test T 
     ON  
      T.C1 = K.C1 
      AND T.C2 = K.C2 
    INNER JOIN MaxMin M 
     ON 
      K.C1 = M.C1 
      AND K.C2 BETWEEN M.LowerBound AND M.UpperBound 

나는 받기까지

C1 C2 Data 
---------------- 
1 101 A1 
1 102 NULL 
1 103 NULL 
1 104 A4 
1 105 A5 
2 101 B1 
2 102 B2 
2 103 B3 
2 104 NULL 
2 105 B5 

하지만 데이터 열을 적용하는 방법을 볼 수 없습니다, 나는 또한 재귀 CTE 느낌 위 질의를 줄이기 위해서이지만 어떻게 볼 수는 없습니다.


의 (a CTE 일 필요는 없습니다) 및 OtherTable에 그 가입

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Test') 
    DROP TABLE Test; 

CREATE TABLE Test (C1 INT, C2 INT, Data NVARCHAR(10)); 

INSERT INTO Test (C1, C2, Data) VALUES 
(1, 101, 'A1'), 
--(1, 102, 'A1'), 
--(1, 103, 'A1'), 
(1, 104, 'A4'), 
(1, 105, 'A5'), 
(2, 101, 'B1'), 
(2, 102, 'B2'), 
(2, 103, 'B3'), 
--(2, 104, 'B3'), 
(2, 105, 'B5'); 


IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'OtherTable') 
    DROP TABLE OtherTable; 

CREATE TABLE OtherTable (C2 INT); 

INSERT INTO OtherTable (C2) VALUES 
(100), 
(101), 
(102), 
(103), 
(104), 
(105), 
(106); 

답변

2

은 CTE에서 테스트에서 최소 및 C1 당 최대 C2 찾기 (여기서 샘플 위로를 얻을 수 TSQL입니다) between을 사용하십시오. C2 desc

with C as 
(
    select C1, 
     min(C2) minC2, 
     max(C2) maxC2 
    from test 
    group by C1 
) 
select C.C1, 
     O.C2, 
     (
     select top(1) T.Data 
     from test as T 
     where T.C1 = C.C1 and 
      T.C2 <= O.C2 
     order by T.C2 desc 
     ) as Data 
from C 
    inner join OtherTable as O 
    on O.C2 between C.minC2 and C.maxC2 

SQL Fiddle

+0

우수의 지시 top(1)를 사용하여 Data 값의 상관 관계 서브 쿼리를 가져 오기 ! TOP가 CTE 레벨에서 어떻게 사용될 수 있는지 알아 내려고 노력했지만 데이터의 행 수준에 맞습니다! –

관련 문제