SQL Server: вернуть самую последнюю запись на основе даты в столбце - PullRequest
0 голосов
/ 25 октября 2018

У меня проблема с довольно простым запросом, у моей временной таблицы есть первичный ключ и столбец с именем PropertyID1.

Я присоединяюсь к другой таблице, содержащей 3 столбца:

PropertyID, SalePrice, SaleDate

Запрос объединяется на PropertyID1 и PropertyID, и я пытаюсь получить самую последнюю итерацию совпадения PropertyID, так как может быть более 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% уверен, так рад за любые советы, которые вы можете предложить.

Ура

Ответы [ 3 ]

0 голосов
/ 25 октября 2018
  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
0 голосов
/ 25 октября 2018

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;
0 голосов
/ 25 октября 2018

Один вариант использует 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...