在t-sql中基于指定的时间间隔在日期范围内运行记录计数和max()记录的总和

时间:2015-04-07 05:03:00

标签: sql-server tsql sql-server-2008-r2 common-table-expression

示例数据:(假设year_month_record是该月的第一天,是日期时间数据类型)

location    item        year_month_record   type    visits1   visits2
ABC111      11JF445553  2014-01             sales   3         5
ABC111      11JF445553  2014-02             sales   3         6
ABC111      11JF445553  2014-03             sales   2         8
ABC111      11JF445553  2014-04             sales   2         4
ABC111      22WZ777814  2014-02             sales   3         5
ABC111      55RR342013  2014-01             nsales  1         2

对于给定的样本数据,我需要计算具有相同位置和项目的记录在指定的时间间隔内出现的次数。另外,我需要获取指定时间间隔/时间范围的最大值,并根据location,item_number和type来总结它。

输出应该如下所示:

location    year_month_record   length_months   type    count_unique_visits sum_max_visits1 sum_max_visits2
ABC111      2014-01             3               sales   4                   6               13
ABC111      2014-02             3               sales   4                   6               12
ABC111      2014-03             3               sales   2                   4               12
ABC111      2014-04             3               sales   1                   2               4
ABC111      2014-01             3               nsales  1                   1               2

有关计算上述访问次数/访问次数

的说明
  1. 记录1的示例输出:max(项目11JF445553)= 3 + max(项目22WZ77781)= 3. Sum = 6(项目55RR342013具有不同类型)。注2.所有最大总计的记录都在3个月的“length_months”范围内。 2014-01至2014-03。
  2. new“type”将导致新的分组启动
  3. 附加说明:

    1. count_unique_visits是日期范围内每条记录的计数
    2. length_months在执行之前定义,可以硬编码
    3. 当前year_month_record + length_months(即2014-01 year_month_record,length_months = 3)是2014年1月1日至2014年3月
    4. 我尝试过创建一个递归CTE来选择count和max,但是我做错了。

      基本上,我需要能够以递归方式获取计数,并在给定的时间间隔内获取最大值visit1 / 2。

      从01/2014开始,它需要查找接下来三个月的max(visits1 / 2)(基本上是01/2014 - 04/2014)并返回它们。在2014年2月,它将使用02/2014到05/2014的范围并返回最大值。它会在整个记录集中继续这样做。间隔时间为3个月,但之后我可以复制查询并替换为6个月等等。

      结束此主题以询问更具针对性/具体的问题。

      任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以结合使用灌浆子查询,然后使用交叉应用子查询:

DECLARE @len int = 3

SELECT grp.*, SUM(ca.cuv) count_unique_visits, SUM(ca.visits1) sum_max_visits1, SUM(ca.visits2) sum_max_visits2
FROM
(SELECT v.location, v.year_month_record, v.type
 FROM Visits v
 GROUP BY v.location, v.year_month_record, v.type) grp CROSS APPLY
(SELECT COUNT(*) cuv, MAX(visits1) visits1, MAX(visits2) visits2
 FROM Visits ca_v
 WHERE ca_v.location = grp.location AND grp.type = ca_v.type AND ca_v.year_month_record >= grp.year_month_record AND
    ca_v.year_month_record < DATEADD(month, @len, grp.year_month_record)
 GROUP BY ca_v.item
 ) ca
GROUP BY grp.location, grp.year_month_record, grp.type
ORDER BY grp.type DESC, grp.year_month_record

您可以在此SQLFiddle中看到结果。

注意:正如我在原始问题的评论中所写,我怀疑你在请求的输出中有错误,如果没有,请解释......