SQL问题:基于datediff从一个记录到另一个记录获取记录
好吧,这里有个棘手的问题。。。如果我的数据如下所示: 表1SQL问题:基于datediff从一个记录到另一个记录获取记录,sql,datediff,Sql,Datediff,好吧,这里有个棘手的问题。。。如果我的数据如下所示: 表1 ID Date_Created 1 1/1/2009 2 1/3/2009 3 1/5/2009 4 1/10/2009 5 1/15/2009 6 1/16/2009 如何获取彼此相隔2天的记录?我的最终结果集应该是第1-3行和第5-6行。谢谢 这样行吗 select t1.id, t2.id from table1 t1 join table1 t2 on t2.date_crea
ID Date_Created
1 1/1/2009
2 1/3/2009
3 1/5/2009
4 1/10/2009
5 1/15/2009
6 1/16/2009
如何获取彼此相隔2天的记录?我的最终结果集应该是第1-3行和第5-6行。谢谢 这样行吗
select t1.id, t2.id
from table1 t1
join table1 t2
on t2.date_created - t1.date_created <= 2
-这给了你什么
选择不同的t1.id、t1.date\u created、t2.id、t2.date\u created from table1 t1、table1 t2 where datediffdd、t1.date\u created、t2.date\u created=2和t1.id!=t2.id按t1.id排序 我可能建议使用编程代码来实现这一点。您希望收集行组和单独的组。我不认为您可以使用一个只返回一组行的查询来解决此问题。如果您想获得相隔N天的行,您可以尝试以下方法:
select distinct t1.*
from Table1 t1
inner join Table1 t2
on abs(cast(t1.Date_Created - t2.Date_Created as float)) between 1 and 2
select t1.date_created, t2.date_created
from table1 t1, table1 t2
where t1.id <> t2.id and
t2.date_created-t1.date_created between 0 and N;
对于exmaple,正如您所说,如果您希望在2天内获得一个零件的行,
您可以使用以下选项:
select t1.date_created,t2.date_created
from table1 t1, table1.t2
where t1.id <> t2.id and
t2.date_created-t1.date_created between 0 and 2;
我希望这有助于
问候,,
Srikrishna.光标将是最快的,但这里有一个SELECT查询可以做到这一点。请注意,如果相隔N天而不是2天,则必须将表2替换为0到N-1之间的整数表,效率将变得更差 我承认还不完全清楚您想要什么,但我想您想要的是至少包含两行的行范围,其中连续行之间的间隔最多为2天。如果日期随着ID的增加而增加,这应该可以工作
with Two as (
select 0 as offset union all select 1
), r2(ID, Date_Created_o, dr) as (
select
ID, Date_Created+offset,
Date_Created + offset - dense_rank() over (
order by Date_Created+offset
) from r cross join Two
)
select
min(ID) as start, max(ID) as finish
from r2
group by dr
having min(ID) < max(ID)
order by dr;
为什么第5-6行、第5行和第6行只相隔一天?对不起,我没有澄清。。。我是说两天之内。2是一个参数。可能是3天或4天,或者别的什么。差不多,但不完全。如果他们之间有记录的话,仍然可以匹配。也许这就是他想要的?那么第4天、第6天、第8天呢?@Joel:你是如何从这个问题中推断出他只想要id为的连续记录的?@Jon:问题不是从现在开始,而是找到最多相隔这么多天的成对记录,例如,2.除非您希望每对匹配ID出现两次,否则不应在其中包含abs。例如,1,2和2,1都错误,这是必需的,例如,获取第一条记录。也不要让“1/1/2009”日期欺骗您,使您认为如果开始日期适用,您不需要>您的开始日期。一个返回多个结果集的存储过程可能会为您实现这一点。我认为sql server存储过程可以使用多个结果集。
with Two as (
select 0 as offset union all select 1
), r2(ID, Date_Created_o, dr) as (
select
ID, Date_Created+offset,
Date_Created + offset - dense_rank() over (
order by Date_Created+offset
) from r cross join Two
)
select
min(ID) as start, max(ID) as finish
from r2
group by dr
having min(ID) < max(ID)
order by dr;