【问题标题】:Running counts of records and sum of max() records within date range based specified intervals in t-sql基于 t-sql 中指定间隔的日期范围内的记录计数和 max() 记录总和
【发布时间】: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. 记录 1 的示例输出:最大值(项目 11JF445553)= 3 + 最大值(项目 22WZ77781)= 3。总和 = 6(项目 55RR342013 具有不同的类型)。注 2. 总计最大的所有记录都在指定的 3 个月的“length_months”内。 2014 年 1 月至 2014 年 3 月。
  2. 新的“类型”将导致新的分组开始

补充说明:

  1. count_unique_visits 是日期范围内每条记录的计数
  2. length_months 在执行之前定义,可以硬编码
  3. 当前 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


【解决方案1】:

您可以使用分组子查询和交叉应用子查询的组合:

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看到结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2016-05-18
    • 1970-01-01
    • 2017-07-15
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多