2012-04-03 22 views
25

tengo una mesa con estructura siguienteFecha Diferencia entre filas consecutivas

ID  Account Number  Date 
1  1001    10/9/2011 (dd/mm/yyyy) 
2  2001    1/9/2011 (dd/mm/yyyy) 
3  2001    3/9/2011 (dd/mm/yyyy) 
4  1001    12/9/2011 (dd/mm/yyyy) 
5  3001    18/9/2011 (dd/mm/yyyy) 
6  1001    20/9/2011 (dd/mm/yyyy) 

Básicamente lo que me gustaría hacer es tener una consulta de Access que calcula la diferencia de fechas de los registros consecutivos, pero para el mismo número de cuenta El el resultado esperado sería !!

1001  10/9/2011 - 12/9/2011  2 days 
1001  12/9/2011 - 20/9/2011  8 days 
1001  20/9/2011     NA 

Básicamente lo que me gustaría hacer es tener una consulta de Access que calcula la diferencia de fechas de los registros consecutivos pero por el mismo número de cuenta, en el ejemplo anterior sería 1001. (las fechas no tienen por qué se muestra en el resultado)

utilizo el acceso 2003.

Respuesta

39
SELECT T1.ID, 
     T1.AccountNumber, 
     T1.Date, 
     MIN(T2.Date) AS Date2, 
     DATEDIFF("D", T1.Date, MIN(T2.Date)) AS DaysDiff 
FROM YourTable T1 
     LEFT JOIN YourTable T2 
      ON T1.AccountNumber = T2.Accountnumber 
      AND T2.Date > T1.Date 
GROUP BY T1.ID, T1.AccountNumber, T1.Date; 

o

SELECT ID, 
     AccountNumber, 
     Date, 
     NextDate, 
     DATEDIFF("D", Date, NextDate) 
FROM ( SELECT ID, 
        AccountNumber, 
        Date, 
        ( SELECT MIN(Date) 
         FROM YourTable T2 
         WHERE T2.Accountnumber = T1.AccountNumber 
         AND  T2.Date > T1.Date 
        ) AS NextDate 
      FROM YourTable T1 
     ) AS T 
+0

El segundo funcionó perfectamente, gracias. Existe la posibilidad de que pueda evitar que el último, que es 1000 20/9/2011 NA, aparezca en el resultado ... ya que no tiene otra fecha para comparar. Gracias de nuevo por la ayuda. –

+0

Agregue 'WHERE NextDate IS NOT NULL' después de' AS T' a la segunda consulta, o cambie 'LEFT JOIN' por' INNER JOIN' en la consulta principal. – GarethD

+0

¡Sí, perfecto! –

0

probar esto:

select [Account Number], DATEDIFF(DD, min(date), max(date)) as dif 
from your_table 
group by [Account Number] 
+0

cierto. no se dio cuenta de que la identificación era una clave. Pensé que era parte de la cuenta de alguna manera. gracias – Diego

+0

@Diego: ¡creo que la consulta que ha proporcionado solo proporcionará la diferencia de fecha entre la primera y la última fecha y no entre todas las fechas! correcto? –

+0

diferencia en cada número de cuenta. ¿No es eso lo que necesitabas? – Diego

3

se puede añadir un WHERE para el número de cuenta, si es necesario. Su mesa se llama t4

SELECT 
    t4.ID, 
    t4.AccountNumber, 
    t4.AcDate, 
    (SELECT TOP 1 AcDate 
    FROM t4 b 
    WHERE b.AccountNumber=t4.AccountNumber And b.AcDate>t4.AcDate 
    ORDER BY AcDate DESC, ID) AS NextDate, 
    [NextDate]-[AcDate] AS Diff 
FROM t4 
ORDER BY t4.AcDate; 
-1
SELECT ID, 
     AccountNumber, 
     Date, 
     NextDate, 
     DATEDIFF("D", Date, NextDate) 
FROM ( SELECT ID, 
        AccountNumber, 
        Date, 
        ( SELECT MIN(Date) 
         FROM YourTable T2 
         WHERE T2.Accountnumber = T1.AccountNumber 
         AND  T2.Date > T1.Date 
        ) AS NextDate 
      FROM YourTable T1 
     ) AS T 
0

respuesta de GarethD me funcionó perfectamente.

FYI: Cuando necesite la cláusula ORDER BY, utilícela al final de la consulta SELECT en la raíz.

SELECT ConsignorID, 
      DateRequired StartDate, 
      NextDate, 
      DATEDIFF("D", DateRequired, NextDate) 
FROM ( SELECT ConsignorID, 
       DateRequired, 
       (SELECT MIN(DateRequired) 
       FROM "TABLENAME" T2 
       WHERE T2.DateRequired > T1.DateRequired 
       ) AS NextDate 
      FROM "TABLENAME" T1 
     ) AS T 

ORDER BY ASC T.DateRequired

Cuestiones relacionadas