Я провел некоторое время, имея дело со следующим:Определение границ N-группы
Представьте, что у вас есть N число групп с несколькими записями каждая и каждая запись имеет уникальныхstarting
и ending
точек ,
Другими словами:
ID|GroupName|StartingPoint|EndingPoint|seq(row_number)|desired_seq
__|_________|_____________|___________|_______________|____________
1 | Grp1 |2014-01-06 |2014-01-07 |1 |1
__|_________|_____________|___________|_______________|____________
2 | Grp1 |2014-01-07 | 2014-01-08|2 |2
__|_________|_____________|___________|_______________|____________
3 | Grp2 |2014-01-08 | 2014-01-09|1 |1
__|_________|_____________|___________|_______________|____________
4 | Grp1 |2014-01-09 | 2014-01-10|3 |1
__|_________|_____________|___________|_______________|____________
5 | Grp2 |2014-01-10 | 2014-01-11|2 |1
__|_________|_____________|___________|_______________|____________
Как вы можете видеть, starting point
для каждой последовательной записи такой же, как ending point
предыдущего.
В принципе, я хотел бы получить minimumS and maximumS
для каждой группы на основе дат. Как только появится запись с новым именем группы, рассмотрите ее как новую группу и сбросьте последовательность.
Одно row_number()
функция не достаточна для выполнения этой задачи, так как оно не отражают изменения в названиях групп. (Я включил колонку SEQ в данном образце, который представляет значения, генерируемые номер строки)
Желаемых результат на основании данных выборки:
1 Grp1 |2014-01-06 | 2014-01-08
2 Grp2 |2014-01-08 | 2014-01-09
3 Grp1 |2014-01-09 | 2014-01-10
4 Grp2 |2014-01-10 | 2014-01-11
То, что я пробовал:
;with cte as(
select *
, row_number() over (partition by GroupName order by startingpoint) as seq
from table1
)
select *
into #temp2
from cte t1
left join cte t2 on t1.id=t2.id and t1.seq= t2.seq-1
select *
,(select startingPoint from #temp2 t2 where t1.id=t2.id and t2.seq= (select MIN(seq) from #temp2) as Oldest
(select startingPoint from #temp2 t2 where t1.id=t2.id and t2.seq= (select MAX(seq) from #temp2) as MostRecent
from #temp2 t1
Судя по таблице, похоже, что вы можете просто использовать 'MIN' и' MAX', если я что-то не упустил. – Zane