If I'm understanding correctly, here's what I'd do in this situation:
IF object_id('tempdb..#foo') IS NOT NULL
DROP TABLE #foo;
CREATE TABLE #foo (item CHAR(1), changedate DATETIME, value INT);
INSERT #foo (item, changedate, value)
VALUES ('x', '2014-06-15', 0);
INSERT #foo (item, changedate, value)
VALUES ('y', '2014-06-16', 1);
INSERT #foo (item, changedate, value)
VALUES ('x', '2014-07-10', 1);
INSERT #foo (item, changedate, value)
VALUES ('y', '2014-07-15', 2);
INSERT #foo (item, changedate, value)
VALUES ('x', '2014-08-10', 3);
WITH CTE AS
(
SELECT RN = ROW_NUMBER() OVER(ORDER BY item, changedate),
*
FROM #foo
)
SELECT
-- CTE1.RN,
CTE1.item,
CTE1.value,
CTE1.changedate AS startdate,
ISNULL(DATEADD(day, -1, CTE2.changedate), '9999-12-31') AS enddate
FROM CTE AS CTE1
LEFT OUTER JOIN CTE AS CTE2 ON
CTE1.RN + 1 = CTE2.RN
AND CTE1.item = CTE2.item
;
This way you have a start and end date range for each value of each product that you can query.