如何获得今天关闭日期的所有行

时间:2014-12-25 16:12:41

标签: sql sql-server-2008

我在这种形式的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

3 个答案:

答案 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]最接近今天的名称的行组成。

检查SQLFiddle

答案 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}}通常用于表示唯一标识符。