Estou tentando contar o número de itens se eles não estiverem dentro de 30 segundos do primeiro item em um "grupo". Estou tendo dificuldade em descobrir isso.
Então, eu tenho essa tabela:
WITH ADates AS (
SELECT
Id
, SharedId
, TheDateTime
FROM (VALUES
(CAST(1 AS int), CAST(1 AS int), CAST('2019-01-01 01:01:00.00' AS datetime2(7))),
(2, 1, '2019-01-01 01:01:33.00'),
(3, 1, '2019-01-01 01:02:00.00'),
(4, 1, '2019-01-01 01:02:01.00'),
(5, 1, '2019-01-01 01:02:04.00'),
(6, 1, '2019-01-01 01:06:15.00'),
(7, 2, '2019-01-01 01:06:00.00'),
(8, 2, '2019-01-01 01:06:45.00'),
(9, 1, '2019-01-01 01:02:31.00'),
(10, 2, '2019-01-01 01:06:05.00'),
(11, 2, '2019-01-01 01:06:46.00'),
) X (Id, SharedId, TheDateTime)
)
Então, o resultado esperado que estou procurando é:
+==========+=======+
| SharedId | Count |
+==========+=======+
| 1 | 4 |
+----------+-------+
| 2 | 2 |
+----------+-------+
Os números são determinados por:
- Conte desde o primeiro no novo grupo.
- Não dentro de 30 segundos do grupo anterior, então é um novo grupo e conta.
- Não conte, pois está a 30 segundos de 2.
- Não conte, pois está a 30 segundos de 2.
- Contar desde que não esteja dentro de 30 segundos do grupo anterior (Item 2).
- Contar desde que não esteja dentro de 30 segundos do grupo anterior (item 2).
- Contagem em novo grupo para SharedId.
- Contar desde que não esteja dentro do agrupamento anterior.
Eu estou pensando que eu deveria estar fazendo um Window Function
para isso. Só não tenho certeza de como fazer isso depender apenas do primeiro do grupo.