One way is to expand the dates with a number/tally table and then roll them up again:
-- *** Consumable Test Data ***
-- Please supply in future with dates in ISO format.
CREATE TABLE #t
(
DateFrom date NOT NULL
,DateTo date NOT NULL
,Price money NOT NULL
);
INSERT INTO #t
VALUES ('20130620', '20130826', 199.99)
,('20130827', '20140121', 199.99)
,('20131003', '20131031', 149.99)
,('20131102', '20131107', 149.99)
,('20131125', '20131126', 149.99)
,('20131127', '20131129', 140.00)
,('20131130', '20131205', 149.99)
,('20131206', '20131206', 140.00)
,('20131207', '20131225', 149.99)
,('20140114', '20140114', 119.99);
-- *** End Test Data ***
WITH Numbers(n)
AS
(
-- 10000 rows
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
)
,MinPrices
AS
(
SELECT A.PriceDate, MIN(Price) AS Price
FROM #t T
JOIN Numbers N
ON N.N <= DATEDIFF(day, T.DateFrom, T.DateTo) + 1
CROSS APPLY (VALUES( DATEADD(day, N -1, T.DateFrom)) ) A(PriceDate)
GROUP BY A.PriceDate
)
,Grps
AS
(
SELECT PriceDate, Price
,ROW_NUMBER() OVER (ORDER BY PriceDate)
- ROW_NUMBER() OVER (PARTITION BY Price ORDER BY PriceDate) AS Grp
FROM MinPrices
)
,Results
AS
(
SELECT MIN(PriceDate) AS DateFrom
,MAX(PriceDate) AS DateTo
,Price
,Grp
FROM Grps
GROUP BY Price, Grp
)
SELECT DateFrom, DateTo, Price
FROM Results
ORDER BY DateFrom;