Sql 连续行之间的日期差

Sql 连续行之间的日期差,sql,ms-access,Sql,Ms Access,我有一张有以下结构的桌子 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

我有一张有以下结构的桌子

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)
基本上,我想做的是有一个access查询,用于计算连续记录的日期差,但对于相同的帐号 预期的结果是

1001      10/9/2011 - 12/9/2011     2 days
1001      12/9/2011 - 20/9/2011     8 days
1001      20/9/2011                 NA
基本上,我想做的是有一个access查询,用于计算连续记录的日期差,但对于相同的帐号,在上面的示例中为1001。结果中不必显示日期

我使用access 2003。

尝试以下方法:

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

如果需要,可以为帐号添加WHERE语句。你的桌子叫t4


GarethD的回答对我非常有效

仅供参考:当您需要ORDERBY子句时,请在根目录中的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

按T.Date订购所需ASC

您还可以使用滞后分析功能获得所需结果,如下所示:

假设下面是您的输入表:

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

符合事实的没有意识到ID是一个密钥。我以为这是帐户的一部分。thanks@Diego:我认为您提供的查询将只提供第一个和最后一个日期之间的日期差,而不是所有日期之间的日期差!!!!正确吗?每个帐号上的差异。这不是你需要的吗?第二个很好用,谢谢。有没有可能我可以避免最后一个,即2011年9月20日1000 NA出现在结果上。。。因为这没有其他日期可比。再次感谢您的帮助。将AS T后的WHERE NextDate NOT NULL添加到第二个查询中,或者将左连接更改为顶部查询中的内部连接。您好,我发布了另一个问题,它是上述要求的变体,请您查看一下,谢谢!!第二个答案的最内层查询中对DateConce的引用是否与下一个向外查询和第一个答案中的YourTable相同?如果没有,是什么?对不起,是的。这是我为测试它而创建的表。我已将此更改为您的表格,以避免将来出现混淆。问题标记为MS Access,据我所知,Access不支持分析功能。问题还指出OP使用的是Access 2003,它肯定不支持滞后功能。因此,尽管这对于其他DBMS来说是一种很好的方法,但这并不是这个问题的答案。此外,OP需要当前行和下一个日期之间的差异,因此您需要使用LEAD而不是LAG@GarethD-哎呀。我没注意到。谢谢:-
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
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
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