Вы можете использовать переменные для назначения групп. Как вы сказали, только если date_begin и date_end точно совпадают для двух строк, они будут в одной группе. Идет новая группа.
select rep_id,area,date_begin,date_end,
,case when @repid <> rep_id then @rn:=1 --reset the group to 1 when rep_id changes
when @repid=rep_id and @begin=date_begin and @end=date_end then @rn:[email protected] --if rep_id,date_begin and date_end match use the same @rn previously assigned
else @rn:[email protected]+1 --else increment @rn by 1
end as group_id
,@begin:=date_begin
,@end:=date_end
,@repid:=rep_id
from t
cross join (select @rn:=0,@begin:='',@end:='',@repid:=-1) r
order by rep_id,date_begin,date_end
Вышеприведенный запрос включает переменные на выходе. Для того, чтобы получить только group_id
Используйте
select rep_id,area,date_begin,date_end,group_id
from (
select rep_id,area,date_begin,date_end
,case when @repid <> rep_id then @rn:=1
when @repid=rep_id and @begin=date_begin and @end=date_end then @rn:[email protected]
else @rn:[email protected]+1
end as group_id
,@begin:=date_begin
,@end:=date_end
,@repid:=rep_id
from t
cross join (select @rn:=0,@begin:='',@end:='',@repid:=-1) r
order by rep_id,date_begin,date_end
) x
Можете ли вы также опубликовать ожидаемый результат? –
@GiorgosBetsos, ожидаемый результат - таблица, которую я опубликовал, извините, должен был упомянуть об этом. Все в таблице выше существует в данный момент, кроме group_id. То, что я разместил, - это то, как должно выглядеть. –
Итак, вы действительно хотите создать 'group_id'? –