¿Cómo obtener las fechas de agrupación de registros para un lapso de 3 días en SQL?

Se está volviendo difícil agrupar y mostrar registros cada 5 días.

Aquí están mis datos:

FLIGHT_DATE LANDINGS    PILOTID COPILOTNAME MONT    DPT

11/16/2013  1   A   B   11  5.5
11/17/2013  1   A   B   11  13
11/19/2013  1   A   B   11  12.55
11/19/2013  1   A   B   11  4
11/21/2013  1   A   B   12  6
11/24/2013  1   A   B   12  6.03
11/25/2013  1   A   B   11  5.5
11/26/2013  1   A   B   11  13
11/26/2013  1   A   B   11  12.55
11/30/2013  1   A   B   11  4
12/1/2013   1   A   B   12  6
12/2/2013   1   A   B   12  6.03        

Quiero mostrarlo de la siguiente manera:

Week Start  Week End    DPT         
11/17/2013  11/21/2013  35.55           
11/22/2013  11/26/2013  37.08           
11/27/2013  12/1/2013   6           
12/2/2013   12/6/2013   6.03

preguntado el 02 de diciembre de 13 a las 08:12

Sobre qué conceptos básicos eligió 11/17/2013 como inicio de semana? -

2 Respuestas

Aquí está mi solución propuesta:

DECLARE @MinDate AS DATETIME = (SELECT MIN(flight_date) FROM flights);

WITH cte
AS
(
    SELECT
        flight_date, DATEDIFF(DAY, @MinDate, flight_date) AS NoDays,
        DATEDIFF(DAY, @MinDate, flight_date)/5 AS NoGroup,
        DPT
    FROM flights
)
SELECT  
    DATEADD(DAY, NoGroup*5, @MinDate) AS [Week Start],
    DATEADD(DAY, NoGroup*5+4, @MinDate) AS [Weed End],  
    SUM(DPT)
FROM cte
GROUP BY NoGroup;

La idea es formar grupos de 5 días, luego asociar un registro a un grupo específico basado en la división con 5. NoDays representa los días transcurridos desde MinDate hasta Flight_Date.

Respondido el 02 de diciembre de 13 a las 09:12

Sí, la solución anterior es más relevante de usar. Gracias - RKV

Puedes usar esta consulta. Debe especificar la fecha de inicio a partir de la cual desea contar y la cantidad de días en cada período (que parece ser 5 en su caso), pero ajuste esos números según sea necesario.

declare @startdate date = '20131117'
declare @interval int = 5

select dateadd(dd, @interval * (o.number - 1), @startdate) WeekStart, 
    dateadd(dd, @interval * o.number - 1, @startdate) WeekEnd,
    sum(d.DPT) DPT
from yourtable d
inner join
    (select ROW_NUMBER() over (order by object_id) as number from sys.all_objects) as o
on d.FLIGHT_DATE >= dateadd(dd, @interval * (o.number - 1), @startdate)
and d.FLIGHT_DATE < dateadd(dd, @interval * o.number, @startdate)
group by o.number
order by dateadd(dd, @interval * (o.number - 1), @startdate)

Respondido el 02 de diciembre de 13 a las 09:12

Si empiezo mi lapso de días (7 días en lugar de 4) el 25/11, el registro fechado el 01/12 se agregará a la próxima semana: RKV

Solo date cuenta, tu intervalo es 5, no 4. - Szymon

Ok, ahora verifiqué que es correcto. Pero tiene un error, para las fechas 11/27/2013 12/1/2013 debería ser 10 ya que tiene 2 registros con 4 y 6 allí. - Szymon

Gracias ! Muchas gracias, el script funciona bien con solo mirar el comentario que publicaste: RKV

sí, se suma incluso para la misma fecha y múltiples registros, muchas gracias por su apoyo. RKV

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