Salve Federico,
puoi utilizzare la funzione LAG (
https://docs.microsoft.com/it-it/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15), che nella fuzionalita' di windowing restituisce la riga con offset precedente, e quindi filtrare in base alla data di ricerca...
considerando il set
INSERT INTO [dbo].[Articoli]
VALUES ( '01', 'Pippo' ), ( '02', 'Fede' );
INSERT INTO [dbo].[Articoli$Variazioni]
VALUES ( '2019-01-01', '01', 10, 'Paperino' ), ( '2019-01-02', '01', 8, 'Paperino' ), ( '2019-01-03', '01', 12, 'Pluto' )
, ( '2019-01-01', '02', 1, 'a' ), ( '2019-01-02', '02', 2, 'b' ), ( '2019-01-03', '02', 3, 'c' )
puoi trivialmene scrivere
DECLARE @data date = '2019-01-03';
DECLARE @Cod varchar(5) = '01';
WITH cte AS (
SELECT a.[Cod]
, av.[Data]
, av.[NomeSec] AS [Nome Corrente]
, LAG( av.[NomeSec], 1, [NomeSec]) OVER (ORDER BY a.[Cod], av.[Data]) AS [Nome Precedente]
, av.[Prezzo] AS [Prezzo Corrente]
, LAG( av.[Prezzo], 1, av.[Prezzo]) OVER (ORDER BY a.[Cod], av.[Data]) AS [Prezzo Precedente]
FROM [dbo].[Articoli] a
JOIN [dbo].[Articoli$Variazioni] av ON av.[Cod] = a.[Cod]
)
SELECT *
FROM cte
WHERE
cte.[Cod] = @Cod
AND
cte.[Data] = @data;
--/----------------------
Cod Data Nome Corrente Nome Precedente Prezzo Corrente Prezzo Precedente
----- ---------- ------------- --------------- ---------------- ------------------
01 2019-01-03 Pluto Paperino 12.0000 8.0000
[edit]
ho modificato la CTE sopra per permettere anche una ricerca per SOLA data senza indicare il Codice di filtro articoli... si puo' ora togliere nella WHERE il filtro cte.[Cod] = @Cod e viene ritornato l'intero parco articoli
[/edit]
salutoni omnia
--
Andrea