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 |
+----+-------+-------------------------+-----+