Это типичная проблема пробелов и островов.Вы можете назначить номера строк записям в группах записей, имеющих одинаковые значения name
, и в группах, имеющих одинаковые значения name
и type
.Разница между номерами строк дает вам группу, к которой принадлежит каждая запись.
Рассмотрим:
SELECT
name,
MIN(date) FromDate,
MAX(date) ToDate,
type
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(PARTITION BY name ORDER BY date) rn1,
ROW_NUMBER() OVER(PARTITION BY name, type ORDER BY date) rn2
FROM mytable t
) x
GROUP BY name, rn1 - rn2, type
ORDER BY name, FromDate
Демонстрация на DB Fiddle :
name | FromDate | ToDate | type
:--- | -------: | -------: | :---
Jack | 19700715 | 19890831 | T
Jack | 19910920 | 19920526 | N
Jack | 19930409 | 20160411 | T