Sql 连续日期上存在ID(即相交)的日期的不同列表

Sql 连续日期上存在ID(即相交)的日期的不同列表,sql,tsql,set,Sql,Tsql,Set,我正在尝试使用MSSQL查询生成公寓价格列表。查询的最终目的是计算公寓平均价格的百分比变化。然而,如果检索到的价格列表是正确的,我可以在代码中修改最终的计算,即取平均值 使这一点变得棘手的是,公寓一直在出售和新增,因此在每周比较价格时,我有每周的数据,我只想比较在t-1、t、t、t+1、t+1、t+2等周内有记录价格的公寓的价格。换句话说,一些在时间t-1有记录价格的公寓可能在时间t不存在,而一些公寓可能在时间t被添加,因此在时间t-1不存在。我只想选择t-1周和t周的价格,其中t-1周和t周都

我正在尝试使用MSSQL查询生成公寓价格列表。查询的最终目的是计算公寓平均价格的百分比变化。然而,如果检索到的价格列表是正确的,我可以在代码中修改最终的计算,即取平均值

使这一点变得棘手的是,公寓一直在出售和新增,因此在每周比较价格时,我有每周的数据,我只想比较在t-1、t、t、t+1、t+1、t+2等周内有记录价格的公寓的价格。换句话说,一些在时间t-1有记录价格的公寓可能在时间t不存在,而一些公寓可能在时间t被添加,因此在时间t-1不存在。我只想选择t-1周和t周的价格,其中t-1周和t周都存在一些ApartmentID,以计算t周的平均变化

示例数据

------------------------------------------------------------- | RegistrationID | Date | Price | ApartmentID | ------------------------------------------------------------- | 1 | 2014-04-04 | 5 | 1 | | 2 | 2014-04-04 | 6 | 2 | | 3 | 2014-04-04 | 4 | 3 | | 4 | 2014-04-11 | 5.2 | 1 | | 5 | 2014-04-11 | 4 | 3 | | 6 | 2014-04-11 | 7 | 4 | | 7 | 2014-04-19 | 5.1 | 1 | | 8 | 2014-04-19 | 4.1 | 3 | | 9 | 2014-04-19 | 7.1 | 4 | | 10 | 2014-04-26 | 4.1 | 3 | | 11 | 2014-04-26 | 7.2 | 4 | ------------------------------------------------------------- 清单2: 在这里,没有什么会消失,因为每个单元都存在于这个列表范围内的元组中

------------------------------------------------------------- | RegistrationID | Date | Price | ApartmentID | ------------------------------------------------------------- | 4 | 2014-04-11 | 5.2 | 1 | | 5 | 2014-04-11 | 4 | 3 | | 6 | 2014-04-11 | 7 | 4 | | 7 | 2014-04-19 | 5.1 | 1 | | 8 | 2014-04-19 | 4.1 | 3 | | 9 | 2014-04-19 | 7.1 | 4 | -------------------------------------------------------------
这里有一个解决方案。首先,我从我命名为ApartmentPrice的表中获取所有记录,计算周数,即该周的周日,前一周是前一周的周日,下一周是下一周的周日。我把它存储在一个表变量中,你也可以把它放在CTE或temp表中

declare @tempTable table(RegistrationId int, PriceDate date, Price decimal(8,2), ApartmentId int, WeekOf date, PreviousWeek date, NextWeek date)
Insert @tempTable
select ap.RegistrationId, 
ap.PriceDate,
ap.Price,
ap.ApartmentId,
DATEADD(ww, DATEDIFF(ww,0,ap.PriceDate), 0) WeekOf, 
DATEADD(ww, DATEDIFF(ww,0,dateadd(wk, -1, ap.PriceDate)), 0) PreviousWeek,
DATEADD(ww, DATEDIFF(ww,0,dateadd(wk, 1, ap.PriceDate)), 0) NextWeek
from ApartmentPrice ap
然后我将这个表变量连接到它自己,其中WeekOf等于NextWeek或PreviousWeek。这就给了在接下来的一周里有记录的公寓

select distinct t.RegistrationId, t.PriceDate, t.Price, t.ApartmentId
from @tempTable t
join @tempTable t2 on t.ApartmentId = t2.ApartmentId and (t.WeekOf = t2.PreviousWeek or t.WeekOf = t2.NextWeek)
order by t.RegistrationId, t.ApartmentId, t.PriceDate
我之所以使用distinct,是因为如果某个公寓确实有相邻一周的记录,那么它将在结果中出现不止一次

您还可以找到每周的平均价格,如下所示:

select t.WeekOf, avg(distinct t.Price)
from @tempTable t
join @tempTable t2 on t.ApartmentId = t2.ApartmentId and (t.WeekOf = t2.PreviousWeek or t.WeekOf = t2.NextWeek)
group by t.WeekOf
order by t.WeekOf

这是一个例子。我在测试数据中又添加了几行,以显示它处理跨越年终边界的日期。

根据示例数据的结果编辑您的问题。日期可以是一周中的任意一天,还是始终是同一天?我从你上面的数据中了解到,你有星期五4/4和4/11以及星期六4/19和4/26的代表,但我不确定这是故意的还是打字错误。@Jerrad,这是故意的。价格每周只记录一次,但我不能保证它是在mod 7间隔上。因此,如果一个价格是在4/5周六,另一个是4/6周日,那么这些价格是否被视为间隔一周,因为它们存在于两个单独的星期中,即使它们实际上只间隔一天?@Jerrad,这永远不会发生。我可以保证记录之间的间隔不会少于5天。然而,从某种意义上讲,使用week number有点误导,并不是问题的核心,尽管这样看问题可能更容易解决。对我来说,你把这一周的时间分配在哪里并不重要,只要是一致的。价格将始终在最后一天的7天内出现。谢谢!这真的很接近解决方案。不过我仍然相信我需要两张单独的桌子。查找从第t-1周到第t周的百分比变化时,仅限在这两周都有记录的公寓。但是,当从t到t+1进行计算时,周期t的公寓组可能与前一个时间间隔的公寓组不同。我曾尝试使用您的解决方案作为两个单独表的基础,但我仍在努力。有没有可能产生这样的修正案的想法?这有帮助吗?我修改了查询以包含下一个上一列。如果公寓在下一周有条目,则为N;如果公寓在上一周有条目,则为P;如果公寓同时有两个条目,则为NP。
select t.WeekOf, avg(distinct t.Price)
from @tempTable t
join @tempTable t2 on t.ApartmentId = t2.ApartmentId and (t.WeekOf = t2.PreviousWeek or t.WeekOf = t2.NextWeek)
group by t.WeekOf
order by t.WeekOf