我在这种形式的SQL中有一个表:
id Name Date
----------------------------
1 john 04/05/2014
2 andi 12/05/2014
3 mark 05/08/2014
4 sofie 05/11/2014
5 john 12/12/2014
5 mark 15/12/2014
我希望选择此形式的数据“distinct”
id Name Date
---------------------------
1 john 12/12/2014
2 mark 15/12/2014
3 andi 12/05/2014
答案 0 :(得分:1)
试试这个:
-- 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
此解决方案按名称对原始数据集进行排名,如果有相同的名称,则按今天和[日期]之间的天数对它们进行排名。因此,结果数据集由具有唯一名称的行和具有[date]最接近今天的名称的行组成。
答案 1 :(得分:1)
尝试类似:
SELECT t1.*
FROM <table_name> t1
WHERE t1.date = (SELECT MAX(t2.date)
FROM <table_name> t2
WHERE t2.name = t1.name)
答案 2 :(得分:0)
看起来你可能想要
SELECT name, MAX(date)
FROM table
GROUP BY name
但是,根据您的示例,无法推断您排除sofie
的标准(以及示例表中重复 id
的含义 - { {1}}通常用于表示唯一标识符。