2017-06-26 90 views
0

我有一個現有的數據庫,其中一些邏輯是由前端應用程序製作的。 現在我必須作出從該數據庫的報告,我面對的失蹤記錄proble其覆蓋在前端記錄的基礎,但在報告中有問題 考慮下表:用先前存在的記錄填充缺失的記錄

create table #T (id int, id1 int, label varchar(50)) 
create table #T1 (id int, T_id1 int, A int, B int, C int) 

隨着值:

insert into #T values (10, 1, 'label1'), (10, 2, 'label2'), (10, 3, 'label3'), (10, 15, 'label15'), (10, 16, 'label16'), (20, 100, 'label100'), (20, 101, 'label101') 
insert into #T1 values (10, 1, 100, 200, 300), (10, 15, 150, 250, 350), (20, 100, 151, 251, 351), (20, 101, 151, 251, 351) 

,如果我做一個報告中,我們可以看到一些丟失的記錄:

select #T.id, #T.id1, #T1.A, #T1.B, #T1.C 
from #T left join #T1 on #T.id1 = #T1.T_id1 

結果:

id id1 A B C 
10 1 100 200 300 
10 2 NULL NULL NULL 
10 3 NULL NULL NULL 
10 15 150 250 350 
10 16 NULL NULL NULL 
20 100 151 251 351 
20 101 151 251 351 

預期的結果將是:

id id1 A B B 
10 1 100 200 300 
10 2 100 200 300 
10 3 100 200 300 
10 15 150 250 350 
10 16 150 250 350 
20 100 151 251 351 
20 101 151 251 351 

正如你可以在這裏看到丟失的數據填寫的第一個(在ID,ID1順序)以前的現有記錄的一個給定的ID。對於給定的id,可以有任意數量的「缺失」記錄,並且對於給定的id,在不存在記錄之後可以存在任意數量的現有記錄。 我能做到這一點用遊標,但我正在尋找一個解決方案,而光標

+0

是否有可能,2個不同的行將具有相同的id和id1對,或者我可以將這些列作爲唯一對待? –

+0

編號id,id1對(甚至id1單獨)是唯一的) – Gabor

回答

2

您可以使用子查詢(找到具有相同值的組)+窗函數

WITH Grouped AS (
    SELECT #T.id, #T.id1, #T1.A, #T1.B, #T1.C, 
     GroupN = SUM(CASE WHEN #T1.A IS NULL THEN 0 ELSE 1 END) OVER(/* PARTITION BY id ? */ ORDER BY id1 ROWS UNBOUNDED PRECEDING) 
    FROM #T 
    LEFT JOIN #T1 ON #T.id1 = #T1.T_id1 
) 
SELECT Grouped.id, Grouped.id1, 
    A = MAX(A) OVER(PARTITION BY GroupN), 
    B = MAX(B) OVER(PARTITION BY GroupN), 
    C = MAX(C) OVER(PARTITION BY GroupN) 
FROM Grouped 
+0

接縫工作(儘管沒有按照分句)。謝謝 – Gabor

0

您可以使用下面的SQL所需的輸出:

with cte (id, id1, A, B, C) 
as 
(
    select #T.id, #T.id1, #T1.A, #T1.B, #T1.C 
    from #T left join #T1 on #T.id1 = #T1.T_id1 
) 
select cte.id, cte.id1, 
coalesce(cte.A,TT.A) A, 
coalesce(cte.B,TT.B) B, 
coalesce(cte.C,TT.C) C 
from cte 
left join 
(
    select p.id1,max(q.id1) id1_max 
    from cte p 
    inner join cte q on p.id1 > q.id1 and p.a is null and q.a is not null 
    group by p.id1 
) T on cte.id1 = T.id1 
left join cte TT on T.id1_max = TT.id1