【发布时间】:2015-06-11 14:37:00
【问题描述】:
示例数据:(假设 year_month_record 是该月的第一天,并且是 datetime 数据类型)
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
对于给定的样本数据,我需要计算具有相同位置和项目的记录在指定时间间隔内出现的次数。此外,我需要获取指定间隔/时间范围的最大值,并根据位置、item_number 和类型进行总结。
输出应该是这样的:
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/访问次数2的注意事项
- 记录 1 的示例输出:最大值(项目 11JF445553)= 3 + 最大值(项目 22WZ77781)= 3。总和 = 6(项目 55RR342013 具有不同的类型)。注 2. 总计最大的所有记录都在指定的 3 个月的“length_months”内。 2014 年 1 月至 2014 年 3 月。
- 新的“类型”将导致新的分组开始
补充说明:
- count_unique_visits 是日期范围内每条记录的计数
- length_months 在执行之前定义,可以硬编码
- 当前 year_month_record + length_months(即 length_months = 3 的 2014-01 year_month_record)是 01/2014 到 03/2014
我尝试创建一个递归 CTE 来选择计数和最大值,但我做错了。
基本上,我需要能够递归地获取给定时间间隔的计数和最大访问次数 1/2。
从 01/2014 开始,它需要查找接下来三个月(基本上是 01/2014 - 04/2014)的 max(visits1/2) 并将其返回。在 02/2014 中,它将使用 02/2014 到 05/2014 的范围,并在那里返回最大值。它将在整个记录集中继续进行。间隔为 3 个月,但我可以复制查询并替换为 6 个月,依此类推。
关闭此主题以提出更有针对性/具体的问题。
任何帮助将不胜感激。
【问题讨论】:
-
您如何存储
year_month_record?它的数据类型是什么? -
year_month_record 只是当月第一天的缩短版本,因此如有必要,可以假定为日期时间。
-
好的,我已经阅读了您的笔记,并多次查看了您的数据和预期结果。而且我仍然不知道您是如何得出一些预期结果的。也许如果你再澄清一点? (附带说明一下,您是否尝试过多个 CTE,每个都为其组计算一个聚合,然后将您的 CTE 与您的主查询连接起来?)
-
我有一个我认为是正确的解决方案,但它与您的某些计算不匹配(sum_max_visits2 行 2 和 3 分别为 13 和 8)。你确定你的计算是正确的(如果是,请解释这些值)?
标签: sql-server tsql sql-server-2008-r2 common-table-expression