Najpierw trochę danych testowych:
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)
Opierając się na odpowiedzi Dave'a Barkera, w widokach wbudowanych dodaj row_number(), abyśmy wiedzieli, która jest pierwszą wartością min, która jest drugą itd. według taryfId. (Właściwie, ponieważ data nie może mieć więcej niż jednego identyfikatora taryfy, nie musimy dzielić według identyfikatora taryfy.)
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
Wyniki:
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