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