2017-04-17 23 views
0

如何使用內部連接來擺脫我不想要的模式? 我的工作表看起來是這樣的:如何做內部連接以擺脫困境

ID Edited_date Status 
------------------------ 
1 1/1/2015  A  
1 1/1/2016  B  
1 2/1/2016  C  
2 1/1/2017  D  
2 3/1/2017  B  
3 1/1/2016  C  
3 4/1/2017  B  
3 1/1/2014  D 

不過,我只是想從最近的EDITED_DATE

ID Edited_date Status 
------------------------ 
1 2/1/2016  C 
2 3/1/2017  B 
3 4/1/2017  B 
+1

你可以用'ROW_NUMBER'用'PARTITION BY'條款。 –

+0

通過「擺脫」你的意思是刪除它們或只是從選擇結果中排除它們?此外爲什麼要求內部連接? –

回答

2
select * from [table] t1 
inner join 
(
select ID, max(Edited_date) maxDt 
from [Table] 
group by ID 
) t2 
on t1.ID = t2.ID 
and t1.Edited_date = t2.maxDt; 
1

對於只選擇每筆貸款的狀態:

SELECT * 
FROM 
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Edited_date desc) as Indicator 
FROM TABLE_NAME 
) as ABC 
WHERE ABC.Indicator = 1 

刪除:

WITH ABC 
AS 
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Edited_date desc) as Indicator 
FROM TABLE_NAME 
) 
DELETE FROM ABC 
WHERE ABC.Indicator != 1 
1

使用row_number()通過id劃分,以獲得最新edited_date

select id, edited_date, status 
from (
    select * 
    , rn = row_number() over (partition by id order by edited_date desc) 
    from t 
    ) as s 
where rn = 1 

top with ties版本:

select top 1 with ties 
    id 
    , edited_date 
    , status 
from t 
order by row_number() over (partition by id order by edited_date desc) 
-1
Begin Transaction 

Create table #temp (Id int, Edited_date date, Status char(2)) 

Insert into #temp 
Values 
('1','1/1/2015','A'), 
('1','1/1/2016','B'), 
('1','2/1/2016','C'),  
('2','1/1/2017','D'),  
('2','3/1/2017','B'),  
('3','1/1/2016','C'),  
('3','4/1/2017','B'),  
('3','1/1/2014','D') 

Create table #temp2 (Id int, Edited_date date, Status char(2)) 

Insert into #temp2 
Values 
('1','2/1/2016','C'), 
('2','3/1/2017','B'), 
('3','4/1/2017','B') 

/** emphasis on the below **/ 

;with cte as (
Select max(Edited_date) as Edited_date, Status From #temp Group By Status 
union all 
Select max(Edited_date) as Edited_date, Status From #temp2 Group By Status 
) 

Select Status, max(Edited_date) as Recent_Edited_date From cte Group By Status 

/** End of Emphasis **/ 

Drop table #temp 
Drop table #temp2 

Rollback 

--- Result --- 

Status| Recent_Edited_date 

A| 2015-01-01  
B| 2017-04-01  
C| 2016-02-01  
D| 2017-01-01 
+0

歡迎來到SO!請閱讀[如何回答](http://stackoverflow.com/help/how-to-answer)並使用降價格式化工具來使您的答案更易於閱讀。不幸的是,你的答案A)不是一個通用的解決方案(它只適用於這個數據集)和B)不提供OP要求的結果。 –