2014-12-25 26 views
-1

与关闭我有一个表中的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 

,我想选择在这个表单数据“独特”

id  Name  Date 
--------------------------- 
1  john  12/12/2014 
2  mark  15/12/2014 
3  andi  12/05/2014 
+0

哪个DBMS? MySQL?你想要不同的名字? –

+0

SQL服务器2008 –

+1

@JetmirMorina,在**什么标准**你会排除'sofie'从输出? 'mark'和'andi'如何切换ID?这提出了更多的疑问,而不是它的答案,而且必须真正澄清(不是英语问题!) –

回答

0

看起来你可能想

SELECT name, MAX(date) 
FROM table 
GROUP BY name 

不过,从你的例子是不可能推断出在什么准则您会排除sofie (以及重复id在你的例子中是什么意思表 - id通常用于表示唯一标识符)。

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 

此解决方案按名称对原始数据集进行排名,并且在有相同名称的情况下按照从今天到[日期]之间的天数进行排名。因此,结果数据集由具有唯一名称的行和具有[日期]与今天最接近的名称的行组成。

检查SQLFiddle

1

尝试类似:

SELECT t1.* 
FROM <table_name> t1 
WHERE t1.date = (SELECT MAX(t2.date) 
      FROM <table_name> t2 
      WHERE t2.name = t1.name) 
相关问题