Я не уверен в причинах полей ID и em_name, поэтому я буду рассматривать его так, как если бы идентификатора было достаточно для использования отдельно.
Я использую логику просто так ... Группа может быть представлена последней записью в группе. И последняя запись - это просто запись, у которой нет соответствующей записи на следующий день.
При условии, что существует индекс для (ID, Em_Reg_Date), это должно быть довольно быстро.
SELECT
ID,
COUNT(*)
FROM
your_table [source]
WHERE
NOT EXISTS (
SELECT
*
FROM
your_table
WHERE
Em_Reg_Date = [source].Em_Reg_Date + 1
AND ID = [source].ID
)
GROUP BY
ID
EDIT
Это изменяет логику для просмотра «до следующего понедельника», если текущая запись - пятница, суббота или воскресенье.
SET DATEFIRST 1 -- This just ensures that Monday is counted as Day 1
SELECT
ID,
COUNT(*)
FROM
your_table [source]
WHERE
NOT EXISTS (
SELECT
*
FROM
your_table
WHERE
ID = [source].ID
AND Em_Reg_Date <= [source].Em_Reg_Date + CASE WHEN DATEPART(weekday, [source].Em_Reg_Date) >= 5 THEN 8 - DATEPART(weekday, [source].Em_Reg_Date) ELSE 1 END
AND Em_Reg_Date > [source].Em_Reg_Date
)
GROUP BY
ID