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
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