Dear all unfortunately I could not get the solution in this Post to work for my Problem.
I have a Table which stores Prices for each ID and attaches a Date. When the Prices are update a new Entry is generated, hence this talble contains mutliple historic Prices for each ID. Now I want to find for each Item in a List of Id’s the Price witht he closest smaller Date with reference to a given date.
The table looks like:
| ID | Price | Date | |----|-------|------------| | 1 | 5 | 2022-06-01 | | 2 | 10 | 2022-06-01 | | 1 | 4 | 2022-04-01 | .....
I tried something like this but this does not work:
DECLARE @get_Date VARCHAR(100) SET @get_Date = '2022-06-01 00:00:00.000' SELECT ID ,Date ,Price FROM table WHERE ID IN ('1','2') AND Date < CONVERT(DATETIME,@get_Date) ORDER BY Date,ID DESC;
This gives me some output, but I only want exactly one Result per ID?
Any tips would be appreciated.
EDIT:
Tim Biegeleisen´s Solution from below worked fine!
WITH cte AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY DATEDIFF(day, Date, '20220601') ) rn FROM yourTable WHERE Date < '20220601' AND ID in ('1','2') ) SELECT ID, Price, Date FROM cte WHERE rn = 1 ORDER BY ID;
However, it made a significant impact where i put the AND ID in … clause, which i do note quite understand.
Advertisement
Answer
We can use DATEDIFF
along with ROW_NUMBER
here:
WITH cte AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY DATEDIFF(day, Date, '20220601') ) rn FROM yourTable WHERE Date < '20220601' ) SELECT ID, Price, Date FROM cte WHERE rn = 1 ORDER BY ID;
The idea here is to find the date per ID
whose number of days is smallest relative to the target date.