在SQL中查找最近的日期

时间:2015-02-12 15:18:13

标签: sql date

我知道在这个主题上有一些线索,但是,我的查询与我所看到的略有不同,之前提出的解决方案似乎并不适用于我。 我有两个表,X和Y,这里简化为一个ID,实际上我当然有多个ID。期间类别从给定日期持续到下一期间的开始。

ID  Date        Period
A   12/01/2010  1
A   12/03/2010  2
A   15/06/2010  3
A   17/08/2010  4
A   20/10/2010  5

ID    SampleDate
A     20/01/2010
A     25/01/2010
A     21/11/2010

我需要得到的是:

ID    SampleDate   Period
A     20/01/2010   1
A     25/01/2010   1
A     21/11/2010   5

我试过这个:

    with cte as
(
select
    Y.ID,
    Y.sampleDate,
    X.Period,
    ROW_NUMBER() over (PARTITION by Y.ID, Y.sampleDate order by DATEDIFF(day,X.Date, Y.sampleDate)) as DaysSince

from X
left join Y
on X.ID=Y.ID
)

select ID,
sampleDate,
Period
from cte
where DaysSince=1

这会产生正确的表格大小,但不是给出样本的透视周期,而是打印出所有这些的顶部句点编号(对于给定的ID)。 我知道哪里出错了?

1 个答案:

答案 0 :(得分:1)

您的查询中没有任何内容可以删除带有否定日期值的条目,因此如果您将其添加到联接中:

    with cte as
(
select
    Y.ID,
    Y.sampleDate,
    X.Period,
    ROW_NUMBER() over (PARTITION by Y.ID, Y.sampleDate order by DATEDIFF(day,X.Date, Y.sampleDate)) as DaysSince

from X
left join Y
on X.ID=Y.ID and X.Date < Y.sampleDate  /* skip periods after the one we're interested in */
)

select ID,
sampleDate,
Period
from cte
where DaysSince=1
相关问题