Это было взято из Sean Lange комментария. Его ссылка (HERE) была подходящей для вас. Окончательный код из ссылки был ...
WITH
cteGroupedDates AS
(--=== Find the unique dates and assign them to a group.
-- The group looks like a date but the date means nothing except that adjacent
-- dates will be a part of the same group.
SELECT UniqueDate = SomeDate,
DateGroup = DATEADD(dd, - ROW_NUMBER() OVER (ORDER BY SomeDate), SomeDate)
FROM #MyHead
GROUP BY SomeDate
)
--===== Now, if we find the MIN and MAX date for each DateGroup, we'll have the
-- Start and End dates of each group of contiguous daes. While we're at it,
-- we can also figure out how many days are in each range of days.
SELECT StartDate = MIN(UniqueDate),
EndDate = MAX(UniqueDate),
Days = DATEDIFF(dd,MIN(UniqueDate),MAX(UniqueDate))+1
FROM cteGroupedDates
GROUP BY DateGroup
ORDER BY StartDate
;
внесение некоторых изменений имен, чтобы попытаться сделать его легче понять ...
WITH
dateGroup AS
(--This is used to distinguish the different continuous sets of dates
SELECT UniqueDate = date,
DateGroup = DATEADD(dd, - ROW_NUMBER() OVER (ORDER BY date), date)
FROM userdate
GROUP BY date
)
--Using dateGroup to get the groups of dates we can utilize it to get the count for them
SELECT StartDate = MIN(UniqueDate),
EndDate = MAX(UniqueDate),
Days = DATEDIFF(dd,MIN(UniqueDate),MAX(UniqueDate))+1,
u.user_id
FROM dateGroup JOIN userdate u ON u.date = UniqueDate
GROUP BY DateGroup, u.user_id
ORDER BY StartDate
;
Я добавил JOIN userdate u ON u.date = UniqueDate
после FROM dateCount
получить Идентификатор пользователя. Также добавлен u.user_id
в группу. Не работает, потому что u.user_id
находится в SELECT (нужна информация в SELECT в GROUP BY).
данные из таблицы:

Доказательство:

---------- РЕДАКТИРОВАТЬ 1 ----- -----
Я собираюсь угадать, чего вы действительно хотите!
Это то, что я подошел. Два разных запроса с одинаковыми результатами.
Первый запрос:
WITH
dateGroup AS
(--This is used to distinguish the different continuous sets of dates
SELECT UniqueDate = date,
DateGroup = DATEADD(dd, - ROW_NUMBER() OVER (ORDER BY date), date),
user_id
FROM userdate
GROUP BY date, user_id
),
userIDGroup AS
(--This is used to get the previous table that you saw in my original answer
SELECT COUNT(d.user_id) as 'Instances',
d.user_id
FROM dateGroup d
GROUP BY DateGroup, d.user_id
)
SELECT
COUNT(u.user_id) AS 'Instances',
u.user_id
FROM userIDGroup u
GROUP BY u.user_id
;
Второй запрос (тот, который я предпочитаю):
WITH
dateGroup AS
(--This is used to distinguish the different continuous sets of dates
SELECT UniqueDate = date,
DateGroup = DATEADD(dd, - ROW_NUMBER() OVER (ORDER BY date), date),
user_id
FROM userdate
GROUP BY date, user_id
)
SELECT count(c.user_id) AS 'Instances', c.user_id
FROM
(
SELECT COUNT(d.user_id) as 'Instances',
d.user_id
FROM dateGroup d
GROUP BY DateGroup, d.user_id
) c GROUP BY c.user_id
;
Доказательство:

Это довольно просто. Посмотрите на эту статью, которая объясняет довольно четко. http://www.sqlservercentral.com/articles/T-SQL/71550/ –
Это запрос запросов «пробелов и наклонностей». –
Возможный дубликат [SQL Server GROUP BY COUNT Только последовательные строки] (http://stackoverflow.com/questions/29735846/sql-server-group-by-count-consecutive-rows-only) –