I want to only show one occurrences of an exact match of TempString1
, TempString2
, and TempString3
with the latest date. How can I do an exact match of three fields and only display the row that has the latest date?
Table
x
TempString1 TempString2 TempString3 Temp4 TempDate
----------------------------------------------------------------------
A A2 1 1.01 01/22/2020
A A2 1 1.02 01/21/2020
A A2 1 1.03 01/20/2020
A A2 2 1.01 01/21/2020
A A2 2 1.02 01/22/2020
A A2 2 1.03 01/20/2020
A A2 3 1.01 01/20/2020
A A2 3 1.02 01/21/2020
A A2 3 1.03 01/23/2020
OUTPUT:
TempString1 TempString2 TempString3 Temp4 TempDate
----------------------------------------------------------------------
A A2 1 1.01 01/22/2020
A A2 2 1.02 01/22/2020
A A2 3 1.03 01/23/2020
Advertisement
Answer
You can try this using ROW_NUMBER()
function.
The ROW_NUMBER() is a window function that assigns a sequential integer to each row within a partition of a result set. The row number starts with one for the first row in each partition.
The following shows the syntax of the ROW_NUMBER() function:
ROW_NUMBER() OVER (
[PARTITION BY partition_expression, ]
ORDER BY sort_expression [ASC | DESC],
)
SELECT TempString1
,TempString2
,TempString3
,Temp4
,TempDate
FROM (
SELECT TempString1
,TempString2
,TempString3
,Temp4
,TempDate
,ROW_NUMBER() OVER (
PARTITION BY TempString1
,TempString2
,TempString3
ORDER BY TempDate DESC
) AS RN
FROM YourTable
) a
WHERE rn = 1
Here is the live Demo on db<>fiddle.uk.
create table YourTable(TempString1 Varchar(10), TempString2 Varchar(10), TempString3 int, Temp4 decimal(18, 2), TempDate date)
insert into YourTable Values('A', 'A2', 1, 1.01, '01/22/2020'),
('A', 'A2', 1, 02, '01/21/2020'),
('A', 'A2', 1, 1.03, '01/20/2020'),
('A', 'A2', 2, 1.01, '01/21/2020'),
('A', 'A2', 2, 1.02, '01/22/2020'),
('A', 'A2', 2, 1.03, '01/20/2020'),
('A', 'A2', 3, 1.01, '01/20/2020'),
('A', 'A2', 3, 1.02, '01/21/2020'),
('A', 'A2', 3, 1.03, '01/23/2020')
SELECT TempString1
,TempString2
,TempString3
,Temp4
,TempDate
,ROW_NUMBER() OVER (
PARTITION BY TempString1
,TempString2
,TempString3
ORDER BY TempDate DESC
) AS RN
FROM YourTable
In below query the result of above query has been considered as table of name a
SELECT TempString1
,TempString2
,TempString3
,Temp4
,TempDate
FROM (
SELECT TempString1
,TempString2
,TempString3
,Temp4
,TempDate
,ROW_NUMBER() OVER (
PARTITION BY TempString1
,TempString2
,TempString3
ORDER BY TempDate DESC
) AS RN
FROM YourTable
) a
WHERE rn = 1