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

查询加入PropertyID1PropertyID,我想要得到的是匹配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:根据列中的日期返回最近的记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询日期范围保存在 2 列中

SQL:根据最近的日期选择一个字段中的值是唯一的记录

如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?

删除sql视图中的重复记录

SQL Server 日期查询,年月作为单独的列

在 SQL Server 中分组并在一列中连接记录