如何更改SQL Server查询以在14周内得到修复?

如何更改SQL Server查询以在14周内得到修复?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是一个长查询的一部分,该查询显示了用户过去14周的播放时间。我用这部分代码划分了周数,但正如您所看到的,有一天剩余(在输出表中给出)。我想展示整整一周 这里有5个样本日期,每个样本日期的天数差异(假设@MaxDate为2015年2月24日),差异除以7(代表聚合的组id)和每个组中的最早日期 Date DaysDiff DaysDiff/7 min(Date)_per_group 10/02/2015 14 2 10/02/2015 11/

这是一个长查询的一部分,该查询显示了用户过去14周的播放时间。我用这部分代码划分了周数,但正如您所看到的,有一天剩余(在输出表中给出)。我想展示整整一周

这里有5个样本日期,每个样本日期的天数差异(假设
@MaxDate
2015年2月24日
),差异除以7(代表聚合的组id)和每个组中的最早日期

Date        DaysDiff  DaysDiff/7  min(Date)_per_group
10/02/2015  14        2           10/02/2015
11/02/2015  13        1           11/02/2015
12/02/2015  12        1           11/02/2015
...                   1           11/02/2015
18/02/2015  6         0           18/02/2015
...                   0           18/02/2015
24/02/2015  0         0           28/02/2015
基本上,第一组并不能保证在7倍的日期开始,这就是为什么第一组看起来是关闭的,尽管它确实不是

如果第一个“游戏”是在2015年2月10日,那么如果您提供了2015年2月16日或2015年2月23日的
@MaxDate
,您将只能获得间隔均匀的
min(Date)

更新:

“解决方案”实际上取决于你想看到什么。。。如果在我这里的情况下,您希望有3个组(DaysDiff/7为2、1和0),但最小(日期)间隔7天,如下所示:

Date        DaysDiff  DaysDiff/7  min(Date)_per_group
10/02/2015  14        2           04/02/2015
11/02/2015  13        1           11/02/2015
12/02/2015  12        1           11/02/2015
...                   1           11/02/2015
18/02/2015  6         0           18/02/2015
...                   0           18/02/2015
24/02/2015  0         0           28/02/2015
这样的查询应该可以做到:

Select 
    'playing' As activity,
    min(DATEADD(dd,-((DATEDIFF(dd, ad.xDate, @MaxDate)-1) % 7), ad.xDate)) As xDate,
    ...
其思想是,通过减去每个组中的日期与@MaxDate相隔的天数,将其转换为一周中的同一天

如果您希望始终在星期一开始分组,则只需将
@MaxDate
替换为任何星期一的日期即可


如果您希望将日期分组从第一个可用日期开始(即,分组为2015年2月10日、2015年2月17日、2015年2月24日),那么事情会变得有点棘手,因为您无法提前知道开始日期是一周中的哪一天。尽管如此,它仍然可以通过一个“丑陋”的子查询来解决…

我看到您多次提出类似的问题。你可以发布一个sql提琴,这样它能更好地帮助回答你的问题吗?每个问题解决一个特定的多个问题。我正在尝试创建sql fiddle。在不知道
AllDates
中的内容以及它是如何构建的情况下,我们只是猜测您已经删除了此问题中的所有细节,因此现在它没有任何意义。因此,我如何解决此问题,我是一个初学者