Предполагается, что SQL 2005 или более поздняя версия.Просто используйте ROW NUMBER , чтобы присвоить номера строкам, а затем JOIN ON a.id = b.id AND b.rn = a.rn - 1
.
WITH
cte
AS (SELECT c.id,
c.name,
cp.price,
cp.effectivedate,
Row_number() OVER (PARTITION BY c.id ORDER BY cp.effectivedate
DESC)
rn
FROM commodity c
INNER JOIN commodityprice cp
ON c.id = cp.commodityid)
SELECT a.name,
b.price - a.price pricechange
FROM cte a
INNER JOIN cte b
ON a.id = b.id
AND b.rn = a.rn - 1
WHERE b.rn = 1
Вот примеры данных, которые я использовал
WITH Commodity as
( SELECT 1 as ID , 'Test' as name
UNION ALL SELECT 2, 'SecondTest'),
CommodityPrice as
( SELECT 1 as Id , 1 as CommodityID , 1.00 as Price, '06/01/2011' as EffectiveDate
UNION ALL SELECT 2 ,1, 1.50 ,'07/01/2011'
UNION ALL SELECT 4 ,2 ,5.00 ,'06/01/2011'
UNION ALL SELECT 5 ,2 ,10.00 ,'07/01/2011'
UNION ALL SELECT 0 ,1 ,0.66 ,'05/01/2011'
UNION ALL SELECT 3 ,2 ,3.00 ,'05/01/2011'
),
, которые дали такой вывод
name pricechange
---------- ---------------------------------------
Test 0.50
SecondTest 5.00
(2 row(s) affected)
Примечание: вы также можете удалить AND b.rn = a.rn - 1
из JOIN
и добавьте AND a.rn = 2
к WHERE