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