복붙노트

[SQL] 연속 행 사이의 날짜 차이

SQL

연속 행 사이의 날짜 차이

나는 다음과 같은 구조의 테이블이

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)

기본적으로 내가 뭘하고 싶은 연속 레코드하지만 같은 계좌 번호의 날짜 차이를 계산 액세스 쿼리를 가지고있다 예상되는 결과가 될 것이다!

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

기본적으로 내가 IS는 (날짜가 결과에 표시 할 필요가 없습니다) 1001 것입니다 위의 예에서 연속 레코드하지만 같은 계좌 번호의 날짜 차이를 계산 액세스 쿼리를해야합니까 싶은 것이

나는 액세스 2003을 사용합니다.

해결법

  1. ==============================

    1.

    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;
    

    또는

    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
    
  2. ==============================

    2.당신은 또한 원하는 결과를 으려고 LAG 분석 함수를 사용하여 CA :

    당신은 또한 원하는 결과를 으려고 LAG 분석 함수를 사용하여 CA :

    사용자의 입력 테이블은 아래의 가정 :

    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;
    

    여기에 귀하의 출력은 다음과 같습니다

    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
    
  3. ==============================

    3.필요한 경우, 계좌 번호에 대한 WHERE 문을 추가 할 수 있습니다. 귀하의 테이블은 T4라고

    필요한 경우, 계좌 번호에 대한 WHERE 문을 추가 할 수 있습니다. 귀하의 테이블은 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;
    
  4. ==============================

    4.이 시도:

    이 시도:

    select [Account Number], DATEDIFF(DD, min(date), max(date)) as dif
    from your_table
    group by [Account Number]
    
  5. ==============================

    5.GarethD의 대답은 완벽하게 날 위해 일했습니다.

    GarethD의 대답은 완벽하게 날 위해 일했습니다.

    참고 : 당신이 ORDER BY 절을 필요로 할 때, 루트에 SELECT 쿼리의 끝을 사용하십시오.

    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

  6. ==============================

    6.

    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
    
  7. from https://stackoverflow.com/questions/9994862/date-difference-between-consecutive-rows by cc-by-sa and MIT license