【问题标题】:Date Difference between consecutive rows连续行之间的日期差异
【发布时间】:2012-04-17 04:50:04
【问题描述】:

我有一个结构如下的表

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

基本上我想做的是有一个访问查询来计算连续记录的日期差异,但对于相同的帐号,在上面的例子中是 1001。(日期不必显示在结果)

我使用 access 2003。

【问题讨论】:

    标签: sql ms-access


    【解决方案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
    

    【讨论】:

    • 第二个效果很好,谢谢。有没有可能我可以避免最后一个,即 1000 20/9/2011 NA 出现在结果中......因为这没有其他日期可以比较。再次感谢您的帮助。
    • AS T 之后将WHERE NextDate IS NOT NULL 添加到第二个查询中,或者在顶部查询中将LEFT JOIN 更改为INNER JOIN
    • 您好,我发布了另一个问题,它是上述要求的变体,请您看一下谢谢!!
    • 第二个答案最里面的查询中对DateConsec的引用是否与下一个向外查询中的YourTable相同,在第一个答案中?如果不是,那是什么?
    • 对不起,是的。这是我为测试它而创建的表。我已将其更改为您的表格以避免将来混淆。
    【解决方案2】:

    您也可以使用 LAG 分析函数来获得所需的结果:

    假设下面是你的输入表:

    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
    

    【讨论】:

    • 问题用MS Access标记,据我所知Access不支持解析功能。该问题还指出 OP 正在使用 Access 2003,它绝对不支持 LAG() 功能。因此,虽然这对于其他 DBMS 来说是一个很好的方法,但这并不是这个问题的答案。此外,OP 想要当前行和下一个日期之间的差异,因此您需要使用 LEAD() 而不是 LAG()
    • @GarethD--哎呀。我没有注意到这一点。谢谢:-)
    【解决方案3】:

    如果需要,您可以为帐号添加 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】:

      试试这个:

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

      【讨论】:

      • 真的。没有意识到身份证是钥匙。我以为这是帐户的一部分。谢谢
      • @Diego :我认为您提供的查询只会提供第一个和最后一个日期之间的日期差异,而不是所有日期之间的日期差异!!!!正确吗?
      • 每个帐号的差异。这不是你需要的吗?
      【解决方案5】:

      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】:
        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
        

        【讨论】:

          猜你喜欢
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 2019-02-21
          • 1970-01-01
          • 2019-05-17
          • 2018-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多