各位用户为了找寻关于mysql滑动聚合/年初至今聚合原理与用法实例分析的资料费劲了很多周折。这里教程网为您整理了关于mysql滑动聚合/年初至今聚合原理与用法实例分析的相关资料,仅供查阅,以下为您介绍关于mysql滑动聚合/年初至今聚合原理与用法实例分析的详细内容
本文实例讲述了mysql滑动聚合/年初至今聚合原理与用法。分享给大家供大家参考,具体如下:
滑动聚合是按顺序对滑动窗口范围内的数据进行聚合的操作。下累积聚合不同,滑动聚合并不是统计开始计算的位置到当前位置的数据。
这里以统计最近三个月中员工第月订单情况为例来介绍滑动聚合。
滑动聚合和累积聚合解决方案的主要区别在于连接的条件不同。滑动聚合条件不再是b.ordermonth <= a.ordermonth,而应该是b.ordermonth大于前三个月的月份,并且小于当前月份。因此滑动聚合的解决方案的SQL语句如下
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14SELECT
a.empid,
DATE_FORMAT(a.ordermonth,
'%Y-%m'
)
AS
ordermonth,
a.qty
AS
thismonth,
SUM
(b.qty)
AS
total,
CAST
(
AVG
(b.qty)
AS
DECIMAL
(5,2))
AS
avg
FROM
emporders a
INNER
JOIN
emporders b
ON
a.empid=b.empid
AND
b.ordermonth > DATE_ADD(a.ordermonth, INTERVAL -3
MONTH
)
AND
b.ordermonth <= a.ordermonth
WHERE
DATE_FORMAT(a.ordermonth,
'%Y'
)=
'2015'
AND
DATE_FORMAT(b.ordermonth,
'%Y'
)=
'2015'
GROUP
BY
a.empid,DATE_FORMAT(a.ordermonth,
'%Y-%m'
),a.qty
ORDER
BY
a.empid,a.ordermonth
运行结果如下
该解决方案返回的是三个月为一个周期的滑动聚合,但是每个用户包含前两个月并且未满3个月的聚合。如果只希望返回满3个月的聚合,不返回未满3个月的聚合,可以使用HAVING过滤器进行过滤,过滤的条件为MIN(b.ordermonth)=DATE_ADD(a.ordermonth, INTERVAL -2 MONTH),例如
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15SELECT
a.empid,
a.ordermonth
AS
ordermonth,
a.qty
AS
thismonth,
SUM
(b.qty)
AS
total,
CAST
(
AVG
(b.qty)
AS
DECIMAL
(5,2))
AS
avg
FROM
emporders a
INNER
JOIN
emporders b
ON
a.empid=b.empid
AND
b.ordermonth > DATE_ADD(a.ordermonth, INTERVAL -3
MONTH
)
AND
b.ordermonth <= a.ordermonth
WHERE
DATE_FORMAT(a.ordermonth,
'%Y'
)=
'2015'
AND
DATE_FORMAT(b.ordermonth,
'%Y'
)=
'2015'
AND
a.empid=1
GROUP
BY
a.empid,DATE_FORMAT(a.ordermonth,
'%Y-%m'
),a.qty
HAVING
MIN
(b.ordermonth)=DATE_ADD(a.ordermonth, INTERVAL-2
MONTH
)
ORDER
BY
a.empid,a.ordermonth
运行结果如下
年初至今聚合和滑动聚合类似,不同的地方仅在于统计的仅为当前一年的聚合。唯一的区别体现在下限的开始位置上。在年初至今的问题中,下限为该年的第一天,而滑动聚合的下限为N个月的第一天。因此,年初至今的问题的解决方案如下图所示,得到的结果
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14SELECT
a.empid,
DATE_FORMAT(a.ordermonth,
'%Y-%m'
)
AS
ordermonth,
a.qty
AS
thismonth,
SUM
(b.qty)
AS
total,
CAST
(
AVG
(b.qty)
AS
DECIMAL
(5,2))
AS
avg
FROM
emporders a
INNER
JOIN
emporders b
ON
a.empid=b.empid
AND
b.ordermonth >= DATE_FORMAT(a.ordermonth,
'%Y-01-01'
)
AND
b.ordermonth <= a.ordermonth
AND
DATE_FORMAT(b.ordermonth,
'%Y'
)=
'2015'
GROUP
BY
a.empid,a.ordermonth,a.qty
ORDER
BY
a.empid,a.ordermonth
运行结果如下
希望本文所述对大家MySQL数据库计有所帮助。
原文链接:https://www.cnblogs.com/chenqionghe/p/4679750.html