2017-08-10 34 views
1

我有兩個具有相同表格設計的表格。SQL Server:根據兩個表中的特定列獲取最新記錄

tblSpeaker1

--------------------- 
|ID|Speaker |Version| 
|--+--------+-------| 
|B1|Xiong |1  | 
|B1|Ling |2  | 
|B1|Juyng |4  | 
|G4|Micre |1  | 
|G4|Pyong |2  | 
|Y1|Mong |2  | 
--------------------- 

tblSpeaker2

--------------------- 
|ID|Speaker |Version| 
|--+--------+-------| 
|B1|Looke |3  | 
|G4|Chui |3  | 
|G4|Kyui |4  | 
|Y1|Druke |1  | 
--------------------- 

我想實現的是讓基於版本的每個ID的最新記錄沒有,但沒有版本列。

目前,我有這個疑問:

SELECT TOP 1 ID, Speaker 
FROM 
    (SELECT * FROM tblSpeaker1 
    UNION 
    SELECT * FROM tblSpeaker2) 
ORDER BY Version 

但它只返回:

------------- 
|ID|Speaker | 
|--+--------| 
|B1|Juyng | 
------------- 

這應該是輸出

------------- 
|ID|Speaker | 
|--+--------| 
|B1|Juyng | 
|G4|Kyui | 
|Y1|Mong | 
------------- 

請幫助我。謝謝。

回答

3

這是您想要使用PARTITION BY的情況。我給出如下圖示:

declare @tblSpeaker1 table 
(
id char(2), 
speaker varchar(10), 
version int 
) 
declare @tblSpeaker2 table 
(
id char(2), 
speaker varchar(10), 
version int 
) 

insert into @tblSpeaker1 VALUES 
('B1','Xiong',1), 
('B1','Ling',2), 
('B1','Juyng',4), 
('G4','Micre',1), 
('G4','Pyong',2), 
('Y1','Mong',2) 

insert into @tblSpeaker2 VALUES 
('B1','Looke',3), 
('G4','Chui',3), 
('G4','Kyui',4), 
('Y1','Druke',1) 

SELECT id, speaker FROM 
(select id, speaker, version, 
ROW_NUMBER() OVER (PARTITION BY id ORDER BY version DESC) as rn from 
(select id, speaker, version FROM @tblSpeaker1 
union 
select id, speaker, version FROM @tblSpeaker2) u) r 
WHERE r.rn = 1 

爲了讓你明白這裏發生了什麼。首先你需要將兩個表聯合起來(就像你在做的那樣)。接下來,我們使用row_number()函數與partition by組合,通過id獲得編號,其版本號爲desc。最後,我們需要其行號爲1。

+0

最有效的答案。非常感謝。 – theo

+0

我的榮幸。很高興有幫助 –

1
declare @tbResult table (ID varchar(2), Speaker varchar(50)) 
declare @IDTables table (idx int identity(1,1), ID varchar(20)) 
declare @Counter int 
declare @Categories int 
declare @Speakers table (ID varchar(2), Speaker varchar(50), Version int) 

set @Counter = 1 

insert into @Speakers 
select ID, Speaker, Version from tblSpeaker1 
insert into @Speakers 
select ID, Speaker, Version from tblSpeaker2 

insert into @IDTables 
select distinct ID from tblSpeaker1 
union 
select distinct ID from tblSpeaker2 

set @Categories = (select count(ID) from @IDTables) 

while (@Counter <= @Categories) 
begin 
    declare @ID varchar(2) 
    set @ID = (Select ID from @IDTables where idx = @Counter) 

    insert into @tbResult 
    select top 1 ID, Speaker from @Speakers 
    where ID = @ID order by Version Desc 

    set @Counter = @Counter + 1 
end 


select * from @tbResult 
1

使用OVER條款這些值:

WITH united AS 
(
    SELECT * 
     FROM (VALUES ('B1', 'Xiong', 1), 
        ('B1', 'Ling', 2), 
        ('B1', 'Juyng', 4), 
        ('G4', 'Micre', 1), 
        ('G4', 'Pyong', 2), 
        ('Y1', 'Mong', 2)) AS tblSpeaker1(ID, Speaker, Version) 
    UNION 
    SELECT * 
     FROM (VALUES ('B1', 'Looke', 3), 
        ('G4', 'Chui', 3), 
        ('G4', 'Kyui', 4), 
        ('Y1', 'Druke', 1)) AS tblSpeaker2(ID, Speaker, Version) 
), 
numbered AS 
(
    SELECT *, row_number() OVER(PARTITION BY ID ORDER BY Version desc) rn 
     FROM united 
) 
SELECT ID, Speaker 
    FROM numbered 
    WHERE rn = 1; 

輸出:

ID Speaker 
---- ------- 
B1 Juyng 
G4 Kyui 
Y1 Mong 
相關問題