示例数据:(假设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
有关计算上述访问次数/访问次数
的说明附加说明:
我尝试过创建一个递归CTE来选择count和max,但是我做错了。
基本上,我需要能够以递归方式获取计数,并在给定的时间间隔内获取最大值visit1 / 2。
从01/2014开始,它需要查找接下来三个月的max(visits1 / 2)(基本上是01/2014 - 04/2014)并返回它们。在2014年2月,它将使用02/2014到05/2014的范围并返回最大值。它会在整个记录集中继续这样做。间隔时间为3个月,但之后我可以复制查询并替换为6个月等等。
结束此主题以询问更具针对性/具体的问题。
任何帮助都将不胜感激。
答案 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中看到结果。
注意:正如我在原始问题的评论中所写,我怀疑你在请求的输出中有错误,如果没有,请解释......