I don't know that it's faster, but it's certainly simpler.
;
WITH Dates (ID, StartDate, EndDate) AS (
SELECT 1, '20131201', '20170110' UNION ALL
SELECT 2, '20131101', '20161110' UNION ALL
SELECT 3, '20130101', '20140131'
)
SELECT
ID
, MAX(StartDate) AS StartDate
, MAX(EndDate) AS EndDate
, MAX(CASE WHEN n = 5 THEN DaysInPeriod END) AS DaysInYear1
, MAX(CASE WHEN n = 4 THEN DaysInPeriod END) AS DaysInYear2
, MAX(CASE WHEN n = 3 THEN DaysInPeriod END) AS DaysInYear3
, MAX(CASE WHEN n = 2 THEN DaysInPeriod END) AS DaysInYear4
, MAX(CASE WHEN n = 1 THEN DaysInPeriod END) AS DaysInYear5
FROM Dates
CROSS APPLY
(
SELECT n, PeriodDate, DATEDIFF(DAY, LAG(PeriodDate, 1, StartDate) OVER(PARTITION BY ID ORDER BY PeriodDate), PeriodDate) AS DaysInPeriod
FROM
(
SELECT n, DATEADD(YEAR, DATEDIFF(YEAR, -1, GETDATE()) - n, -1) AS PeriodDate
FROM ( VALUES(1), (2), (3), (4), (5) ) t(n)
UNION
SELECT DATEDIFF(YEAR, EndDate, GETDATE()), EndDate
) v
WHERE PeriodDate > StartDate
AND PeriodDate <= EndDate
) v
GROUP BY ID
;
J. Drew Allen
Business Intelligence Analyst
Philadelphia, PA