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.