首页 存档 技术 查看内容

你真的会玩SQL吗?你所不知道的数据聚合

2018-3-30 13:00 |来自: 互联网 308 0

摘要: (点击上方蓝字,快速关注我们) 作者:伯乐在线-欢醉 网址:http://blog.jobbole.com/95160/ 点击“阅读原文”,加入伯乐在线作者团队 本章的内容与 你真的会玩SQL吗?透视转换内容 非常重要,非常重要,非常重 ...

(点击上方蓝字,快速关注我们)


作者:伯乐在线-欢醉

网址:http://blog.jobbole.com/95160/

点击“阅读原文”,加入伯乐在线作者团队


本章的内容与 你真的会玩SQL吗?透视转换内容 非常重要,非常重要,非常重要 ,不理解的可以慢慢看,回头看,过几天再看,以后很多思想需要以此为基础而演变。

此后用到的用例数据库是SQL2008里面的,若看过本系列之前的文章,创建过基础样例数据库就不用再创建。

若没有创建过的,用例数据库文件:链接:http://pan.baidu.com/s/1qW1QxA0 密码:dqxx

连续聚合

下面的例子将使用一个EmpOrdersr汇总表,每位雇员在每个月占一行,包含该雇员在一个月内处理过的订单数量,运行下代码创建数据:

CREATE TABLE EmpOrders

(

empid INT NOT NULL ,

ordmonth DATE NOT NULL ,

--只取到月份2015-07-07

qty INT NOT NULL ,

PRIMARY KEY ( empid, ordmonth )

)

go

INSERT INTO EmpOrders

( empid ,

ordmonth ,

qty

)

SELECT o.empid ,

DATEADD(MONTH, DATEDIFF(MONTH, 0, o.orderdate), 0) AS ordmonth ,

SUM(qty) AS qty

FROM Sales.Orders AS o

JOIN Sales.OrderDetails AS od ON o.orderid = od.orderid

GROUP BY empid ,

DATEADD(MONTH, DATEDIFF(MONTH, 0, o.orderdate), 0)

查询:

SELECT empid ,

ordmonth ,

qty

FROM EmpOrders

ORDER BY empid ,

ordmonth


将输出以下内容

接下来讲讲各类聚合……

1.累积聚合

为每个雇员和每个月,返回从其开始有订单操作以来到该月份处理过的订单总量和每月的平均量,结果如下,怎么做?

SELECT o1.empid ,

o1.ordmonth ,

o1.qty AS qtythismonth ,

SUM(o2.qty) AS totalqty ,

CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty

FROM EmpOrders AS o1

JOIN EmpOrders AS o2 ON o2.empid = o1.empid

AND o2.ordmonth GROUP BY o1.empid ,

o1.ordmonth ,

o1.qty

ORDER BY o1.empid ,

o1.ordmonth

若想得到雇员达到累积总量之前的每月聚合值,怎么做?

SELECT o1.empid ,

o1.ordmonth ,

o1.qty AS qtythismonth ,

SUM(o2.qty) AS totalqty ,

CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty

FROM EmpOrders AS o1

JOIN EmpOrders AS o2 ON o2.empid = o1.empid

AND o2.ordmonth o1.ordmonth

GROUP BY o1.empid ,

o1.ordmonth ,

o1.qty

HAVING SUM(o2.qty)1000

ORDER BY o1.empid ,

o1.ordmonth

对总量做一次HAVING过滤 HAVING SUM(o2.qty)

2.滑动聚合

滑动聚合是对序列内的一个滑动窗口进行的聚合计算,而不是从序列的开始计算到当前位置。

求雇员最近三个月(包括本月)的平均订单量(移动平均数),得到以下结果:

SELECT o1.empid ,

o1.ordmonth ,

o1.qty AS qtythismonth ,

SUM(o2.qty) AS totalqty ,

CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty

FROM EmpOrders AS o1

JOIN EmpOrders AS o2 ON o2.empid = o1.empid

AND (o2.ordmonth o1.ordmonth AND o2.ordmonth

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类