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.