Agrupación de SQL por ID separada por otras ID

Yo uso MS SQL Server 2008 R2. tengo una mesa:

    TypeId EventDate Valor 1. 1 2013-11-01 10:13:00.000 50 2. 1 2013-11-01 10:15:00.000 10 3. 1 2013-11-01 10:18:00.000 40 4. 2 2013- 11-01 10:19:00.000 12 5. 2 2013-11-01 10:21:00.000 545 6. 1 2013-11-01 10:23:00.000 35 7. 1 2013-11-01 10:27:00.000 47 8. 3 2013-11-01 10:30:00.000 3 9. 4 2013-11-01 10:31:00.000 0 10. 4 2013-11-01 10:33:00.000 7 11. 4 2013-11- 01 10:38:00.000 35 12. 1 2013-11-01 10:41:00.000 91 13. 5 2013-11-01 10:45:00.000 37 14. 5 2013-11-01 10:48:00.000 35

Me gustaría tener grupos continuos basados ​​en valores de campo de TypeId, que no estén separados por otros valores de TypeId (cuando el pedido es por EventDate).
En este ejemplo quiero tener siete grupos:

  • TypeId=1, registros 1-3
  • TypeId=2, registros 4-5
  • TypeId=1, registros 6-7
  • TipoId=3, registro 8
  • TypeId=4, registros 9-11
  • TipoId=1, registro 12
  • TypeId=5, registros 13-14

Si uso GROUP BY TypeId, obtengo un grupo para TypeId=1 que consta de registros 1-3, 6-7 y 12

Me gustaría, por ejemplo, obtener la fecha de evento mínima y máxima para cualquiera de estos grupos:

TypeId MinEventDate MaxEventDate 1 2013-11-01 10:13:00.000 2013-11-01 10:18:00.000 2 2013-11-01 10:19:00.000 2013-11-01 10:21:00.000 1 2013-11- 01 10:23:00.000 2013-11-01 10:27:00.000 3 2013-11-01 10:30:00.000 2013-11-01 10:30:00.000 4 2013-11-01 10:31:00.000 2013- 11-01 10:38:00.000 1 2013-11-01 10:41:00.000 2013-11-01 10:41:00.000 5 2013-11-01 10:45:00.000 2013-11-01 10:48:00.000

preguntado el 03 de diciembre de 13 a las 11:12

Muéstranos el resultado esperado -

Espectáculo nosotros una salida esperada. -

Agregue eso a su pregunta editando la publicación, para que sea legible:

2 Respuestas

Aquí hay una alternativa que es rápida para grandes conjuntos de datos. El CTE calcula la diferencia entre un número de fila que representa (EventDate) orden y un número de fila que representa (TypeId, EventDate) ordenar, y llama a esa diferencia grp. Dentro de cada consecutivo TypeId segmento, la diferencia será constante y más pequeña que la diferencia que se producirá para el siguiente segmento consecutivo TypeId segmento.

Entonces un grupo de (TypeId, grp) contiene todas las filas consecutivas con el mismo estado:

; with  CTE as 
        (
        select  TypeId
        ,       EventDate
        ,       row_number() over (order by EventDate)
                    - row_number() over (order by TypeId, EventDate) as grp
        from     dbo.TestTable
        )
select  min(EventDate) as mn
,       max(EventDate) as mx
,       TypeId
from    CTE
group by 
        TypeId
,       grp
order by 
        mn;

Véalo funcionando en SQLFiddle

Para obtener más detalles sobre este método, consulte este capítulo de muestra de MVP Deep Dives.

Respondido el 03 de diciembre de 13 a las 14:12

Prueba esta consulta:

With T1 as 
(
select T.*,
 (select TOP 1 EventDate
  from Table1 where TypeID<>T.TypeId
                    and 
                    EventDate<T.EventDate
  ORDER BY EventDate DESC)
  as GrpStart
from Table1 as T
)
Select min(TypeId) as TypeId,
       min(EventDate) as MinEventDate,
       max(EventDate) as MaxEventDate
from T1 Group by GrpStart

Demostración de SQLFiddle

Respondido el 03 de diciembre de 13 a las 12:12

Gracias valex, funciona! Tengo que probarlo en una tabla con una gran cantidad de datos, pero para datos de prueba pequeños funciona bien. - user3060918

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.