I changed the first CTE to read:
;WITH RankedSessions AS (
SELECT
START_DATE,
END_DATE,
PAID,
SESSION_ID,
SESSION_TYPE,
SESSION_ENTER_DATE,
ROW_NUMBER() OVER (
PARTITION BY SESSION_ID, SESSION_TYPE, START_DATE
ORDER BY SESSION_ENTER_DATE DESC
) AS rn
FROM [SESSION] A
WHERE NOT EXISTS (SELECT *
FROM SESSION B
WHERE A.SESSION_ID = B.SESSION_ID
AND A.SESSION_TYPE = B.SESSION_TYPE
AND A.START_DATE >= B.START_DATE
AND A.END_DATE <= B.END_DATE
AND NOT (A.START_DATE = B.START_DATE AND A.END_DATE = B.END_DATE))
),
This still have one more row than your desired result. But then again, I fail to see why that row should be