Tengo datos que tienen una marca de tiempo y un nombre como:
| t | nombre |
|---|---|
| 2021-10-01 00:00:00 | Lugar A (123) |
| 2021-10-01 00:01:00 | Lugar A (123) |
| 2021-10-01 00:06:00 | Lugar A (123) |
| 2021-10-01 00:10:00 | Lugar B (234) |
| 2021-10-01 00:13:00 | Lugar B (234) |
| 2021-10-01 00:15:00 | Lugar C (345) |
| 2021-10-01 00:18:00 | Lugar C (345) |
| 2021-10-01 00:23:00 | Lugar C (345) |
| 2021-10-01 00:27:00 | Lugar C (345) |
| 2021-10-01 00:28:00 | Lugar C (345) |
| 2021-10-01 00:29:00 | Lugar C (345) |
| 2021-10-01 00:30:00 | Lugar A (123) |
| 2021-10-01 00:33:00 | Lugar A (123) |
Quiero construir una consulta que permita encontrar "cohortes" de sesiones de ciclo de proceso donde:
El resultado final debería ser algo como:
| min_data_timestamp | max_data_timestamp | nombre |
|---|---|---|
| 2021-10-01 00:00:00 | 2021-10-01 00:06:00 | Lugar A (123) |
| 2021-10-01 00:10:00 | 2021-10-01 00:13:00 | Lugar B (123) |
| 2021-10-01 00:15:00 | 2021-10-01 00:29:00 | Lugar C (123) |
| 2021-10-01 00:30:00 | 2021-10-01 00:33:00 | Lugar A (123) |
Estoy asumiendo algún tipo de consulta de ventana/CTE para hacer esto. He visto otros ejemplos que encuentran la hora de inicio/finalización general para un nombre o algo similar, pero no donde el nombre se repite en todo momento.
EDITAR tenía algunos errores tipográficos
Puede usar row_number con group by :
with pr as ( select row_number() over (order by id) r, id, name from processes ), pr1 as ( select p.*, (select sum(case when p1.r < pr and p1.name != p.name then 1 end) from pr p1) gid from pr p ) select min(p.id), max(p.id), max(p.name) from pr1 p group by p.gid order by case when p.gid is null then 1 else p.gid end;Producción:
| min_data_timestamp | max_data_timestamp | nombre |
|---|---|---|
| 2021-10-01 00:00:00 | 2021-10-01 00:06:00 | Lugar A (123) |
| 2021-10-01 00:10:00 | 2021-10-01 00:13:00 | Lugar B (234) |
| 2021-10-01 00:15:00 | 2021-10-01 00:29:00 | Lugar C (345) |
| 2021-10-01 00:30:00 | 2021-10-01 00:33:00 | Lugar A (123) |