試試這個:
-- sample data
create table #tbl (id int, name nvarchar(20), [date] date);
insert into #tbl (id, name, [date]) values
(1, 'john', '2014-05-04'),
(2, 'andi', '2014-05-12'),
(3, 'mark', '2014-08-05'),
(4, 'sofie', '2014-11-05'),
(5, 'john', '2014-12-12'),
(5, 'mark', '2014-12-15');
-- solution
with ranked as
(
select id, name, [date]
, row_number() over(partition by name order by datediff(day, [date], getdate())) [rank]
from #tbl
)
select id, name, [date] from ranked where [rank] = 1;
-- cleanup
drop table #tbl;
結果
ID NAME DATE
----------------------
2 andi 2014-05-12
5 john 2014-12-12
5 mark 2014-12-15
4 sofie 2014-11-05
此解決方案按名稱對原始數據集進行排名,並且在有相同名稱的情況下按照從今天到[日期]之間的天數進行排名。因此,結果數據集由具有唯一名稱的行和具有[日期]與今天最接近的名稱的行組成。
檢查SQLFiddle
哪個DBMS? MySQL?你想要不同的名字? –
SQL服務器2008 –
@JetmirMorina,在**什麼標準**你會排除'sofie'從輸出? 'mark'和'andi'如何切換ID?這提出了更多的疑問,而不是它的答案,而且必須真正澄清(不是英語問題!) –