SQL-获取最新记录

SQL-获取最新记录,sql,sql-server,Sql,Sql Server,我有一张表格: Id | Name | Date -----+----------+----------------------- 1 | name1 | 2021-02-10 13:00:00.000 -----+----------+----------------------- 1 | name2 | 2021-02-10 05:00:00.000 -----+----------+----------------------- 1 | nam

我有一张
表格

Id   |   Name   |   Date
-----+----------+-----------------------
1    | name1    | 2021-02-10 13:00:00.000
-----+----------+-----------------------
1    | name2    | 2021-02-10 05:00:00.000
-----+----------+-----------------------
1    | name3    | 2021-02-09 14:00:00.000
-----+----------+-----------------------
2    | name4    | 2021-01-02 03:00:00.000
-----+----------+-----------------------
2    | name5    | 2021-01-07 11:00:00.000
-----+----------+-----------------------
2    | name6    | 2021-01-07 08:00:00.000
我需要为每个
Id
组获取最新
日期的记录(仅日期,不考虑时间):

Id   |   Name   |   Date
-----+----------+-----------------------
1    | name1    | 2021-02-10 13:00:00.000
-----+----------+-----------------------
1    | name2    | 2021-02-10 05:00:00.000
-----+----------+-----------------------
2    | name5    | 2021-01-07 11:00:00.000
-----+----------+-----------------------
2    | name6    | 2021-01-07 08:00:00.000
一种方法使用
RANK()


用一个最小的可重复的例子回答

RANK()
函数是一个窗口函数,可用于计算结果集分区内每一行的排名

分区中具有相同值的行分配相同的秩

顺便说一句,列名选择不当

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT, [name] VARCHAR(30), [Date] DATETIME);
INSERT INTO @tbl (ID, [name], [Date]) VALUES
(1,'name1','2021-02-10 13:00:00.000'),
(1,'name2','2021-02-10 05:00:00.000'),
(1,'name3','2021-02-09 14:00:00.000'),
(2,'name4','2021-01-02 03:00:00.000'),
(2,'name5','2021-01-07 11:00:00.000'),
(2,'name6','2021-01-07 08:00:00.000');
-- DDL and sample data population, end

SELECT tbl.*
FROM (SELECT t.*
             , RANK() OVER (PARTITION BY ID ORDER BY CAST([Date] AS DATE) DESC) AS seq
      FROM @tbl AS t
     ) AS tbl
WHERE tbl.seq = 1;
输出

+----+-------+-------------------------+-----+
| ID | name  |          Date           | seq |
+----+-------+-------------------------+-----+
|  1 | name1 | 2021-02-10 13:00:00.000 |   1 |
|  1 | name2 | 2021-02-10 05:00:00.000 |   1 |
|  2 | name5 | 2021-01-07 11:00:00.000 |   1 |
|  2 | name6 | 2021-01-07 08:00:00.000 |   1 |
+----+-------+-------------------------+-----+

在提问时,您需要提供一个最小的可复制示例。请参考以下链接:请提供以下内容:(1)DDL和示例数据填充,即创建表和插入T-SQL语句。(2) 您需要做什么,即逻辑和代码尝试在T-SQL中实现它。(3) 所需输出,基于上述#1中的样本数据。(4) 您的SQL Server版本(选择@@version;)请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT, [name] VARCHAR(30), [Date] DATETIME);
INSERT INTO @tbl (ID, [name], [Date]) VALUES
(1,'name1','2021-02-10 13:00:00.000'),
(1,'name2','2021-02-10 05:00:00.000'),
(1,'name3','2021-02-09 14:00:00.000'),
(2,'name4','2021-01-02 03:00:00.000'),
(2,'name5','2021-01-07 11:00:00.000'),
(2,'name6','2021-01-07 08:00:00.000');
-- DDL and sample data population, end

SELECT tbl.*
FROM (SELECT t.*
             , RANK() OVER (PARTITION BY ID ORDER BY CAST([Date] AS DATE) DESC) AS seq
      FROM @tbl AS t
     ) AS tbl
WHERE tbl.seq = 1;
+----+-------+-------------------------+-----+
| ID | name  |          Date           | seq |
+----+-------+-------------------------+-----+
|  1 | name1 | 2021-02-10 13:00:00.000 |   1 |
|  1 | name2 | 2021-02-10 05:00:00.000 |   1 |
|  2 | name5 | 2021-01-07 11:00:00.000 |   1 |
|  2 | name6 | 2021-01-07 08:00:00.000 |   1 |
+----+-------+-------------------------+-----+