• 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.


    "If I had been drinking out of that toilet, I might have been killed." -Ace Ventura