2012-04-03 11 views
25

Mam tabeli z następującą strukturęData Różnica między kolejnymi rzędami

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) 

zasadzie to, co chciałbym zrobić, to mieć kwerendy dostępu, który oblicza różnicę dat kolejnych rekordów, ale dla tego samego numeru konta The oczekiwany wynik byłby !!

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

zasadzie to, co chciałbym zrobić, to mieć kwerendy dostępu, który oblicza różnicę dat kolejnych rekordów, ale dla tego samego numeru konta, w powyższym przykładzie byłby 1001. (daty nie trzeba udostępniana w wyniku)

używam dostęp 2003.

Odpowiedz

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; 

lub

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

Drugi zadziałał doskonale, dzięki. Czy jest możliwość, że uda mi się uniknąć ostatniego, czyli 1000 20/9/2011 NA z powodu pojawienia się wyniku ... ponieważ nie ma innej daty do porównania. Jeszcze raz dziękuję za pomoc. –

+0

Dodaj "GDZIE NextDate NIE JEST NIŻĄ" po "AS T" do drugiego zapytania lub zmień "LEFT JOIN" na "INNER JOIN" w górnym zapytaniu. – GarethD

+0

Yup Perfect !!! –

0

spróbuj tego:

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

prawdziwej. nie zdawałem sobie sprawy, że identyfikator jest kluczem. Myślałem, że to jakoś część konta. dzięki – Diego

+0

@Diego: wydaje mi się, że podane przez Ciebie zapytanie podaje tylko różnicę dat między pierwszą a ostatnią datą, a nie pomiędzy wszystkimi datami !!!! poprawne? –

+0

różnica na każdym numerze konta. czy to nie to, czego potrzebujesz? – Diego

3

można dodać WHERE dla numeru rachunku, jeżeli jest to wymagane. Tabela nazywa 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

odpowiedź GarethD pracował dla mnie idealnie.

FYI: Kiedy potrzebujesz klauzuli ORDER BY, użyj jej na końcu zapytania SELECT w katalogu głównym.

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 T.DateRequired ASC

Powiązane problemy