在 SQL 中查找最近的日期

Finding nearest dates in SQL

我知道有一些关于这个主题的话题,但是,我的查询与我所看到的略有不同,之前提供的解决方案似乎对我不起作用。 我有两个table,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

这会生成 table 的正确大小,但它不会给出样本的透视周期,它只是打印出所有样本的顶部周期编号(对于给定的 ID)。 知道我在哪里犯了错误吗?

您的查询中没有任何内容可以删除具有负 datediff 的条目,因此如果您将其添加到连接中:

    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