我知道在这个主题上有一些线索,但是,我的查询与我所看到的略有不同,之前提出的解决方案似乎并不适用于我。 我有两个表,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)。 我知道哪里出错了?
答案 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