SELECT
id_type,
date AS begin,
COALESCE(LEAD(prev_date) OVER (ORDER BY date ASC), last_date) AS end
FROM
(
SELECT
id_type,
date,
LAG(date) OVER (ORDER BY date ASC) AS prev_date,
MAX(date) OVER () AS last_date,
CASE id_type WHEN LAG(id_type) OVER (ORDER BY date ASC) THEN 0 ELSE 1 END AS is_start
FROM
tmp
) AS derived
WHERE
is_start = 1
ORDER BY
date ASC
;