Tengo una tabla con la siguiente estructura

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 en el que se calcula la diferencia de fechas para registros consecutivos, pero para el mismo número de cuenta
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 en el que se calcula la diferencia de fechas para registros consecutivos, pero para el mismo número de cuenta , en el ejemplo anterior sería 1001. (las fechas no se muestran en el resultado)

Puedo usar access 2003.

6 Comentarios

  1. 52
    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
    • La segunda funcionó a la perfección , gracias. Existe una posibilidad de que yo pueda evitar el último , que es de 1000 20/9/2011 NA de aparecer en el resultado… ya que este no tiene otra fecha para comparar. Gracias de nuevo por la ayuda.
    • Agregar WHERE NextDate IS NOT NULL después de AS T a la segunda consulta, o cambiar el LEFT JOIN a un INNER JOIN en la parte superior de la consulta.
    • Yup Perfecto !!!
    • Hola, he publicado otra pregunta, que es una variante de la anterior requisito, Podría usted por favor, eche un vistazo, Gracias !!
    • Es la referencia a DateConsec en el interior de la consulta de la segunda respuesta de la misma como YourTable en la siguiente consulta hacia el exterior, y en la primera respuesta? Si no, ¿qué es?
    • Lo siento, sí que se es. Era la tabla que he creado para la prueba. He cambiado esto a su mesa para evitar confusiones en el futuro.
    • Yo estaba buscando algo como esto, sin embargo, he encontrado un problema con esta solución. Se produce la diferencia de fechas entre una fecha determinada, y la fecha más temprana en el conjunto. ¿Cómo se modifica un bucle a través de fechas, por lo que hemos datediff(d, date0, fecha1), datediff(d, fecha1, fecha2) en lugar de datediff(d, date0, fecha1), datediff(d, date0, fecha2)?
    • Si usted solo desea que todas las combinaciones, a continuación, utilizar una simple combinación (similar a la primera solución). Si lo que desea es una suma de la datediff, luego con la primera solución puede cambiar DATEDIFF("D", T1.Date, MIN(T2.Date)) AS DaysDiff a SUM(DATEDIFF("D", T1.Date, T2.Date)) AS DaysDiff – Si esto no ayuda, entonces usted probablemente tendrá que hacer una nueva pregunta.
    • Me las arreglé para ordenar esta utilizando un enfoque diferente. El de arriba no funciona, ya que tengo muchos, muchas fechas, y unirse a ellos uno por uno sería más bien torpe. Pero gracias por tu respuesta!
    • Esta solución fue la respuesta a varias horas de búsqueda,…con un ligero ajuste. Si usted está usando SQLIte, entonces usted tendrá que reemplazar (en la segunda solución, y de manera similar en la primera) DATEDIFF("D",Date,NextDate) con (julianday(NextDate) - julianday(Date)) as difference_in_days como SQLite no tiene ninguna función DateDiff.
    • Rishal – Sólo un complemento a la anteriormente buenas respuestas. He publicado mi respuesta con la ayuda de la función analítica.

  2. 3

    Puede añadir un lugar de instrucción para el número de cuenta, si es necesario. La tabla 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;
  3. 2

    ca también el uso de LAG función de análisis para obtener los resultados deseados como :

    Supongamos que es su tabla de entrada:

    id  account_number  account_date
    1     1001          9/10/2011
    2     2001          9/1/2011
    3     2001          9/3/2011
    4     1001          9/12/2011
    5     3001          9/18/2011
    6     1001          9/20/2011
    
    
    select id,account_number,account_date,
    datediff(day,lag(account_date,1) over (partition by account_number order by account_date asc),account_date)
    as day_diffrence
    from yourtable;

    Aquí está tu salida:

    id  account_number  account_date    day_diffrence
    1     1001           9/10/2011    NULL
    4     1001           9/12/2011    2
    6     1001           9/20/2011    8
    2     2001           9/1/2011     NULL
    3     2001           9/3/2011     2
    5     3001           9/18/2011    NULL
    • La cuestión está etiquetada con MS Access, y como yo sé Access no admite las funciones de análisis. También la cuestión de los estados de la OP está usando el Acceso de 2003, que definitivamente no admite la LAG() función. Así, mientras que este es un buen enfoque para otros DBMS, esto no es una respuesta a esta pregunta. También, el OP quiere que la diferencia entre la fila actual y la próxima fecha, por lo que tendría que utilizar LEAD() en lugar de LAG()
    • oops. No me di cuenta de que. Gracias 🙂
  4. 0

    intente esto:

    select [Account Number], DATEDIFF(DD, min(date), max(date)) as dif
    from your_table
    group by [Account Number]
    • verdadero. no se dan cuenta de la IDENTIFICACIÓN fue una de las claves. Pensé que era parte de la cuenta de alguna manera. gracias
    • creo que la consulta que usted ha proporcionado sólo proporcionará a diferencia de fechas entre la primera y la última fecha y no entre todas las fechas !!!! la correcta ?
    • la diferencia en cada número de cuenta. no es que lo que needded?
  5. 0

    GarethD la respuesta para mí funcionaba perfectamente.

    FYI: Cuando usted necesita cláusula ORDER BY, por favor utiliza al final de la consulta de selección 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

    ORDEN POR T. DateRequired ASC

  6. -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

Dejar respuesta

Please enter your comment!
Please enter your name here