试试这个:
-- 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?这提出了更多的疑问,而不是它的答案,而且必须真正澄清(不是英语问题!) –