Это легко сделать с помощью LAG
:
DECLARE @t TABLE (timestamp DATETIME, category VARCHAR(100));
INSERT INTO @t VALUES
('2018-10-01 04:06:12', 'CAT1'),
('2018-10-01 05:07:18', 'CAT1'),
('2018-10-01 05:07:19', 'CAT1'),
('2018-10-01 05:07:20', 'CAT1'),
('2018-10-01 06:09:29', 'CAT1'),
('2018-10-01 07:24:12', 'CAT2'),
('2018-10-01 07:30:43', 'CAT2'),
('2018-10-01 07:59:13', 'CAT2'),
('2018-10-01 08:02:15', 'CAT2'),
('2018-10-01 10:09:25', 'CAT2'),
('2018-10-01 11:13:42', 'CAT2');
WITH cte1 AS (
SELECT timestamp, category, CASE WHEN LAG(timestamp) OVER (PARTITION BY category ORDER BY timestamp) > DATEADD(MINUTE, -5, timestamp) THEN 0 ELSE 1 END AS chg
FROM @t
)
SELECT category, COUNT(CASE WHEN chg = 1 THEN 1 END)
FROM cte1
GROUP BY category
Чтобы понять, как это работает, сфокусируйтесь на том, как вычисляется столбец chg
, и посмотрите на результаты cte:
timestamp category chg
2018-10-01 04:06:12.000 CAT1 1
2018-10-01 05:07:18.000 CAT1 1
2018-10-01 05:07:19.000 CAT1 0
2018-10-01 05:07:20.000 CAT1 0
2018-10-01 06:09:29.000 CAT1 1
2018-10-01 07:24:12.000 CAT2 1
2018-10-01 07:30:43.000 CAT2 1
2018-10-01 07:59:13.000 CAT2 1
2018-10-01 08:02:15.000 CAT2 0
2018-10-01 10:09:25.000 CAT2 1
2018-10-01 11:13:42.000 CAT2 1