sumar registros rangos rango por edades edad contar agrupar agrupados sql sql-server sql-server-2005 tsql gaps-and-islands

sql - registros - ¿Cómo puedo agrupar en rangos continuos?



sql agrupar y sumar (5)

Algo como:

SELECT Crew, DayType, MIN(Date) AS SomeDate1, MAX(Date) AS SomeDate2 FROM Mytable GROUP BY Crew, DayType

Conozco algunos sql básicos, pero este me supera. He buscado alto y bajo, pero no dados. Necesito ver los siguientes datos, puedo hacerlo en el código de la capa de aplicación. Pero desafortunadamente para este en particular, el código debe colocarse en la capa de datos.

Estoy usando T-SQL.

Mesa

Date Crew DayType 01-02-11 John Doe SEA 02-02-11 John Doe SEA 03-02-11 John Doe SEA 04-02-11 John Doe HOME 05-02-11 John Doe HOME 06-02-11 John Doe SEA

Necesito una vista como esta

DateFrom DateTo Name DayType 01-02-11 03-02-11 John Doe SEA 04-02-11 05-02-11 John Doe HOME 06-02-11 06-02-11 John Doe SEA

Lamentablemente, se requiere la tabla base para que la capa de aplicación esté en el formato show. ¿Es esto posible de hacer en la consulta?

Gracias

Luke


SELECT MIN(Date) AS DateFrom,MAX(Date) AS DateTo, Crew, DayType FROM yourTableName GROUP BY Crew, DayType


Select Min(Date) DateFrom, Max(Date) DateTo, Crew Name,DayType From Mytable Group By Crew,DayType

prueba esto.


WITH q AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY crew, dayType ORDER BY [date]) AS rnd, ROW_NUMBER() OVER (PARTITION BY crew ORDER BY [date]) AS rn FROM mytable ) SELECT MIN([date]), MAX([date]), crew AS name, dayType FROM q GROUP BY crew, dayType, rnd - rn

Este artículo puede ser de su interés:


WITH grouped AS ( SELECT *, grp = DATEDIFF(day, 0, Date) - ROW_NUMBER() OVER (PARTITION BY Crew, DayType ORDER BY Date) FROM @testtable ) SELECT DateFrom = MIN(Date), DateTo = MAX(Date), Name = Crew, DayType FROM grouped GROUP BY Crew, DayType, grp;

Básicamente, al igual que la solución de Quassnoi, pero al usar un ROW_NUMBER menos rinde un mejor plan de ejecución.