首页 > 解决方案 > SQL Server:根据列中的日期返回最近的记录

问题描述

我遇到了一个非常基本的查询问题,我的临时表有一个主键和一个名为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% 肯定对您可以提供的任何提示感到满意。

干杯

标签: sqlsql-servertsqlgroup-byinner-join

解决方案


一种选择使用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;

推荐阅读