Sql server 左连接并获取最大日期时间值
我有两张桌子 表1Sql server 左连接并获取最大日期时间值,sql-server,datetime,left-join,Sql Server,Datetime,Left Join,我有两张桌子 表1 Id Name =========== 1 Name1 2 Name2 3 Name3 Id Tb1Id DateTime ======================= 1 1 20-09-2017 2 1 01-09-2018
Id Name
===========
1 Name1
2 Name2
3 Name3
Id Tb1Id DateTime
=======================
1 1 20-09-2017
2 1 01-09-2018
3 2 01-09-2016
4 2 02-09-2015
5 3 06-09-2016
6 3 10-09-2019
表2
Id Name
===========
1 Name1
2 Name2
3 Name3
Id Tb1Id DateTime
=======================
1 1 20-09-2017
2 1 01-09-2018
3 2 01-09-2016
4 2 02-09-2015
5 3 06-09-2016
6 3 10-09-2019
我想通过Table1.Id=Table2.Tb1Id
连接这两个表,并从表2中获取最大日期时间值。结果应该是这样的
Id Name DateTime
========================
1 Name1 01-09-2018
2 Name2 01-09-2016
3 Name3 10-09-2019
试试这个
DECLARE @Table1 AS TABLE(Id INT,Name VARCHAR(20))
INSERT INTO @Table1
SELECT 1,'Name1' UNION ALL
SELECT 2,'Name2' UNION ALL
SELECT 3,'Name3'
DECLARE @Table2 AS TABLE(Id INT, Tb1Id INT,[DateTime] DATETIME)
INSERT INTO @Table2
SELECT 1,1,'2017-09-20' UNION ALL
SELECT 2,1,'2018-09-01' UNION ALL
SELECT 3,2,'2016-09-01' UNION ALL
SELECT 4,2,'2015-09-02' UNION ALL
SELECT 5,3,'2016-09-06' UNION ALL
SELECT 6,3,'2019-09-10'
SELECT t2.Tb1Id AS Id,
t1.Name,
MAX(t2.[DateTime]) AS [DateTime]
FROM @Table1 AS T1
INNER JOIN @Table2 AS t2
ON T1.Id = t2.Tb1Id
GROUP BY
t2.Tb1Id,
t1.Name
结果
Id Name DateTime
-----------------------------------
1 Name1 2018-09-01 00:00:00.000
2 Name2 2016-09-01 00:00:00.000
3 Name3 2019-09-10 00:00:00.000
这看起来像一个简单的连接和分组依据。你试过了吗?你遇到问题了吗?唯一奇怪的是日期的外观-日期类型是二进制值,它们没有格式,SSMS显示的日期格式为
YYYY-MM-DD
,以避免本地化字符串产生的混淆。您是否将日期存储为字符串?在这种情况下,您无法计算MAX
,因为您使用的本地化格式只能按字母顺序排序。真正的解决方案是使用日期类型而不是字符串。其他任何东西都会掩盖错误,并可能导致不正确的结果-是01-09
9月1日还是1月9日?哪个更晚,01-09-0218
或09-01-2018
?