SQL问题:基于datediff从一个记录到另一个记录获取记录

SQL问题:基于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

好吧,这里有个棘手的问题。。。如果我的数据如下所示:

表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_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;