Agrupación de SQL por ID separada por otras ID
Frecuentes
Visto 93 veces
3
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
2 Respuestas
1
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
0
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
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 sql-server sql-server-2008-r2 grouping or haz tu propia pregunta.
Muéstranos el resultado esperado - Raj
Espectáculo nosotros una salida esperada. - Radu Gheorghiu
Agregue eso a su pregunta editando la publicación, para que sea legible: Raj