2017-06-12 52 views
1

我在表中有以下數據。查詢根據每個組中的最新日期選擇值。默認爲最大ID如果相同日期

ID Name Date  DepositAmount 

1 John 2012-01-04 70790.90 
2 John 2012-01-04 73450.13 
3 Samuel 2010-06-17 3700.00 
4 Karen 2017-06-01 2210.00 
5 Karen 2013-06-12 1300.00 

對於每個人,我必須選擇最新的存款金額。如果兩個存款都發生在同一天,那麼應該挑選最高ID的記錄。

所以,結果會是什麼樣子

2 John 2012-01-04 73450.13 
3 Samuel 2010-06-17 3700.00 
4 Karen 2017-06-01 2210.00 

嘗試:

我試圖通過使用遊標來處理這一點,但代碼看起來過於複雜和不必要的。

回答

2

使用cross apply()使用top with tiesrow_number()

select top 1 with ties * 
from t 
order by row_number() over (partition by Name order by date desc, id desc) 

:使用

select distinct 
    x.id 
    , t.Name 
    , [Date] = convert(char(10),x.[Date],120) 
    , x.DepositAmount 
from t 
    cross apply (
    select top 1 i.id, i.Date, i.DepositAmount 
    from t i 
    where t.Name = i.Name 
    order by i.Date desc, i.id desc 
    ) x 

一個common table expressionrow_number()

;with cte as (
    select * 
     , rn = row_number() over (partition by Name order by date desc, id desc) 
    from t 
) 
select 
    t.id 
    , t.Name 
    , [Date] = convert(char(10),t.[Date],120) 
    , t.DepositAmount 
from cte t 
where rn = 1 

使用inner join得到max(id)如果同一個名稱not exists()

select 
    t.id 
    , t.Name 
    , [Date] = convert(char(10),t.[Date],120) 
    , t.DepositAmount 
from t 
    inner join (
    select 
     id = max(i.id) 
     , i.Name 
    from t i 
    where not exists (
     select 1 
     from t e 
     where e.Name = i.Name 
     and e.Date > i.Date 
     ) 
    group by i.Name 
    ) m 
    on t.Name = m.Name 
    and t.Id = m.Id 

rextester演示更大的日期:http://rextester.com/GNQ24777

+0

我喜歡這種方法。沒有額外/不需要的字段+1 –