SQL中的开窗函数详解可代替聚合函数使用

| 2020-03-22 19:28:24    标签:

中小企业为什么要选择IT外包呢?

 

 

中小企业选择IT外包服务的原因,首先大家想到的可能是节省成本,但从专业的角度上来说,节省成本却不是最重要的,这时代任何一家企业都会成为IT公司,任何一家企业都会成互联网公司,任何一家企业最终也都会成为数据公司,所以中小企业在发展中,IT的规划和运用是最重要的,这直接决定着这家企业能活多久,能活多好.

 

但往往中小企业负责人为了方便,会直接花钱找个网络管理员,让这个人即处理企业内部电脑和网络的问题,又兼着其它方面的工作,从表面上看好像还挺划算,而且人是自己公司的人,好像也挺放心.

 

但实际恰恰相反,我给大家讲个故事,可能你就明白了.

 

有一家手机企业,他们的核心优势是研发和生产,营销和广告并不是他们具备的能力,为了更好的销售他们生产的手机,他们就请来了一个专门搞营销和广告的经理,因为公司处在发展时期,为了节省成本,所以这个经理就自己一个兵,在没有团队的情况下,又要想策划,又要搞制作,还要设计图片,最终策划出来的方案是二流的,制作和设计还是三流的,导致手机销售量非常差,没有正常现金流,后来这家企业就倒闭关门了.

 

还有一家手机企业,他们的核心优势也是研发和生产,但他们的负责人非常智慧,把营销和广告部分外包给了一家行业顶尖的企业,这家企业帮助他们策划出了一个绝佳的方案,还帮助落实和执行了整个方案,最终大获全胜,当年手机销量迈进了全国前三,后来核算整体在营销和广告的投入和产出却是极低的.

 

上面两个案例,让我们看到了企业致胜的关键不是你有什么,而是你如何利用你的没有.

 

总的来说中小企业选择IT外包公司有三大优势:

 

l  首先节省成本是第一点优势

我们透过下图可以看出企业自招网管和用IT外包公司成本可以节省90%以上,而且还是专业的团队提供服务.


l

  其次专业化的服务让企业有更多的时间抢占先机是第二大优势

专业的团队,可以根据你不同的需要匹配不同的工程师,这大大节省了企业的时间,互联网时代,分秒必争,当年滴滴和快滴的100亿战争,不就是为了赢得时间,让自己更快的战领这个市场,失去先机就失去了一切,所以IT外包公司给你带来的不仅仅是专业,还有先机.




 最后获得专业的解决方案成为行业的领导地位是第三大优势

这个时代已经不是人海战术,而是运用互联网技术,以一当十,以十当百的快速发展,那怎样可以迅速从行业中脱颖而出,就需要互联网的解决方案,一家专业的互联网IT外包公司可以让你快速转型升级,最重要的不仅仅只有方案,还有切实可行的落地执行,让你更专注自己核心业务,达到强强联合的效果.


你的企业IT外包了吗?




SQL中的开窗函数详解可代替聚合函数使用

 

在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,曙光也来临了。如果要想更具体了解开窗函数,请看书《程序员的SQL金典》,开窗函数在mysql不能使用。

       开窗函数与聚合函数一样,都是对行的集合组进行聚合计算。它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by语句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。定义看不懂不要紧,会用就行。

       举个简单例子 查询每个工资小于5000的员工信息(姓名,城市 年龄 薪水),并且显示小于5000的员工个数,尝试使用下面语句:

1

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) FROM T_Person WHERE FSALARY<5000

消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'T_Person.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

         可以使用子查询实现,语句:

1

2

SELECT FName, FCITY, FAGE, FSalary, ( SELECT COUNT(FName) FROM T_Person WHERE FSALARY<5000 ) PersonNum FROM T_Person

WHERE FSALARY<5000

       结果:

     使用开窗函数实现,查询结果一模一样,就不粘贴了:

1

2

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) OVER() as PersonNum FROM T_Person

WHERE FSALARY<5000

1.开窗函数格式:函数名(列) OVER(选项)

2.聚合开窗函数格式:聚合函数(列) OVER(PARTITION BY 字段)

      over关键字把聚合函数当成聚合开窗函数而不是聚合函数,SQL标准允许将所有的聚合函数用做聚合开窗函数。OVER关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果OVER关键字后的括号为空,则开窗函数会对结果集合的所有行进行聚合运算。

      PARTITION BY来定义行的分区来进行聚合运算,与group by 不同,partition by 字句创建的分区是独立于结果集的,创建的分区只是用于进行聚合运算,而且不同的开窗函数所创建的分区不互相影响,例如:查询所有人员的信息,并查询所属城市的人员数以及同年龄的人员数:

1

2

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY) CityNum,

COUNT(FName) OVER(PARTITION BY FAGE) AgeNum FROM T_Person ORDER by FCITY

 

查询所有人员的信息,并查询所属城市的人员数,每个城市的人按照年龄排序语句:

1

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY ORDER BY FAGE) CityNum FROM T_Person

 3.排序开窗函数格式:排序函数() OVER(ORDER BY 字段)

  (1)主要函数有ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()

   ROW_NUMBER() 加行号,一般可以用于分页查询(现在被offset  fetch取代 ),对于没有主键列的表加行号作用很明显,删除重复数据等。

  按照薪水高低给所有人员排序,同样薪水的排名不一样,可以用row_number(),

1

2

3

4

5

with a as

(

SELECT FName, FSalary, FCity, FAge, ROW_NUMBER() over(ORDER BY FSalary) as RowNum FROM T_Person

)

SELECT * FROM a

 使用rank()将每个城市的薪水排行,值一样的同一个排名,出现两个第一名的时候,排在两个第一名后的排名将是第三名

1

SELECT FName, FSalary, FCity, FAge, RANK() over(PARTITION BY FCITY ORDER BY FSalary) as RankNum FROM T_Person

  使用dense_rank()将每个城市的薪水排行,值一样的同一个排名,出现两个第一名的时候,排在两个第一名后的排名将是第三名

 

ntile(数字) over(order by 字段):数字表示一组多少个数,并根据数量得出分组的数量

1

SELECT *,NTILE(5) OVER(ORDER BY FSalary) AS NileNum FROM T_Person