Primeiro alguns dados de teste:
create table seasons (seasonId int primary key
, "date" datetime not null unique
, tariffId int not null)
insert into seasons values (1, '2009-01-01', 1)
insert into seasons values (2, '2009-01-02', 1)
insert into seasons values (3, '2009-01-03', 2)
insert into seasons values (4, '2009-01-04', 3)
insert into seasons values (5, '2009-01-05', 3)
insert into seasons values (6, '2009-01-06', 1)
insert into seasons values (7, '2009-01-07', 1)
insert into seasons values (8, '2009-01-08', 3)
-- add a tarrif with a datespan larger than 2
insert into seasons values (9, '2009-01-09', 4)
insert into seasons values (10, '2009-01-10', 4)
insert into seasons values (11, '2009-01-11', 4)
Com base na resposta de Dave Barker, dentro das visualizações em linha, adicione row_number() para que saibamos qual é o primeiro valor mínimo, qual é o segundo, etc. por tarifaId. (Na verdade, como uma data não pode ter mais de um tarifário, não precisamos particionar por tarifário.)
SELECT MinValues.Seasonid, MinValues.Date, MaxValues.Date, MaxValues.tariffid
FROM (
SELECT *, row_number() over (partition by tariffId order by "date") as RN
FROM [dbo].[Seasons] tbl1
WHERE NOT EXISTS (SELECT *
FROM [dbo].[Seasons] tbl2
WHERE tbl1.seasonid - tbl2.seasonid = 1
AND tbl1.tariffId = tbl2.tariffId)) as minValues
JOIN (
SELECT *, row_number() over (partition by tariffId order by "date") as RN
FROM [dbo].[Seasons] tbl1
WHERE NOT EXISTS (SELECT *
FROM [dbo].[Seasons] tbl2
WHERE tbl2.seasonid - tbl1.seasonid = 1
AND tbl1.tariffId = tbl2.tariffId)) as maxValues
ON MinValues.TariffId = MaxValues.tariffId
and MinValues.RN = MaxValues.RN
order by MinValues.Date
Resultados:
1 2009-01-01 00:00:00.000 2009-01-02 00:00:00.000 1
3 2009-01-03 00:00:00.000 2009-01-03 00:00:00.000 2
4 2009-01-04 00:00:00.000 2009-01-05 00:00:00.000 3
6 2009-01-06 00:00:00.000 2009-01-07 00:00:00.000 1
8 2009-01-08 00:00:00.000 2009-01-08 00:00:00.000 3
9 2009-01-09 00:00:00.000 2009-01-11 00:00:00.000 4