SQL Server:根据列中的日期返回最近的记录
Posted
技术标签:
【中文标题】SQL Server:根据列中的日期返回最近的记录【英文标题】:SQL Server : return most recent record based on date in column 【发布时间】:2019-03-29 14:14:55 【问题描述】:我遇到了一个非常基本的查询问题,我的临时表有一个主键和一个名为 PropertyID1
的列。
我正在加入另一个有 3 列的表:
PropertyID, SalePrice, SaleDate
查询加入PropertyID1
和PropertyID
,我想要得到的是匹配PropertyID
的最新迭代,因为每个ID 可以有10+ 个匹配,我只需要最新的, SaleDate
列用于选择所需的记录。
所以初始查询是
CREATE TABLE ##RPP_CHECK
(
ID INT IDENTITY(1,1) PRIMARY KEY,
PropertyID1 VARCHAR(255) NULL
);
INSERT INTO ##IDCHECK
VALUES (41572498), (41484495), (41590235), (41611406)
SELECT
ID, ##IDCHECK.PropertyID1, PropertyID, SalePrice, SaleDate
FROM
##IDCHECK
LEFT JOIN
[ODS].[RS1] ON [ODS].[RS1].[PropertyID] = ##IDCHECK.PropertyID1
ORDER BY
ID
返回
ID PropertyID1 PropertyID SalePrice SaleDate
--------------------------------------------------
1 41572498 41572498 0.0 01-01-2011
1 41572498 41572498 0.0 01-01-2012
1 41572498 41572498 1000 01-01-2018
2 41484495 41484495 1200 01-02-2018
3 41590235 41590235 2000 01-03-2018
3 41590235 41590235 0.0 01-01-1999
4 41611406 41611406 5000 01-10-2018
我需要它返回的是
ID PropertyID1 PropertyID SalePrice SaleDate
------------------------------------------------
1 41572498 41572498 1000 01-01-2018
2 41484495 41484495 1200 01-02-2018
3 41590235 41590235 2000 01-03-2018
4 41611406 41611406 5000 01-10-2018
我尝试查看此处发布的一些答案,但它们似乎不太合适,我很确定这是 MAX(
问题或分组问题,但不是 100% 肯定对任何人都如此满意您可以提供的提示。
干杯
【问题讨论】:
嗨。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并在minimal reproducible example 上采取行动。 (我用谷歌搜索了你的标题和标签。) how do I query sql for a latest record date for each user的可能重复 【参考方案1】:一个选项使用ROW_NUMBER
:
SELECT ID, PropertyID1, PropertyID, SalePrice, SaleDate
FROM
(
SELECT ID, t1.PropertyID1, PropertyID, SalePrice, SaleDate,
ROW_NUMBER() OVER (PARTITION BY PropertyID ORDER BY SaleDate DESC) rn
FROM IDCHECK t1
LEFT JOIN [ODS].[RS1] t2
ON t2.PropertyID = t1.PropertyID1
) t
WHERE rn = 1;
【讨论】:
这似乎有点工作,但它似乎从 2014 年开始提取较旧的数据,明天当我回到甲板上时会有另一个裂缝 - 谢谢你看:) 您的示例数据没有显示 2014 年的任何内容,我相信我的查询中的逻辑是正确的。你现在应该解决你的问题。【参考方案2】: Use MAX built in function and GROUPBY built in function in JOIN and achieve your
result
BEGIN TRAN
CREATE TABLE #Test ( ID INT , PropertyID1 VARCHAR(100) , PropertyID
VARCHAR(100) , SalePrice DECIMAL(12,2) , SaleDate DATETIME )
INSERT INTO #Test ( ID , PropertyID1 , PropertyID , SalePrice , SaleDate)
SELECT 1,'41572498','41572498',0.0,CONVERT(DATETIME,'01-01-2011',103) UNION ALL
SELECT 1,'41572498','41572498',0.0,CONVERT(DATETIME,'01-01-2012',103) UNION ALL
SELECT 1,'41572498','41572498',1000,CONVERT(DATETIME,'01-01-2018',103) UNION ALL
SELECT 2,'41484495','41484495',1200,CONVERT(DATETIME,'01-02-2018',103) UNION ALL
SELECT 3,'41590235','41590235',2000,CONVERT(DATETIME,'01-03-2018',103) UNION ALL
SELECT 3,'41590235','41590235',0.0,CONVERT(DATETIME,'01-01-1999',103) UNION ALL
SELECT 4,'41611406','41611406',5000,CONVERT(DATETIME,'01-10-2018',103)
SELECT ID , PropertyID1 , PropertyID , SalePrice , SaleDate
FROM #Test
JOIN
(
SELECT PropertyID _PropertyID , PropertyID1 _PropertyID1 , MAX(SaleDate)
_SaleDate
FROM #Test
GROUP BY PropertyID,PropertyID1
) A ON _SaleDate = SaleDate
ROLLBACK TRAN
【讨论】:
【参考方案3】:APPLY
往往表现最好:
SELECT ic.*, r.*
FROM ##IDCHECK ic OUTER APPLY
(SELECT TOP (1) r.*
FROM [ODS].[RS1] r
WHERE r.[PropertyID] = ic.PropertyID1
ORDER BY r.SaleDate DESC
) r;
【讨论】:
这个用最简单的应用程序为我解决了这个问题。以上是关于SQL Server:根据列中的日期返回最近的记录的主要内容,如果未能解决你的问题,请参考以下文章