由partition看窗口函数

最近要完成一个项目,有一个查询可难住了笔者,无论是子查询还是分组,都没弄出来,还是基础知识不行啊。不过呢,可以查资料,最后用一个窗口函数解决了问题。由于开始的数据库是Access,后来笔者导成SQL Server的,一下子明白了很多。
数据库类似是这个样子滴:
Employee表的字段:
empId,englishName,depId
Department表的字段:
depId,deptName
需求是:查找出Department表的所有字段,但是在前面显示出该部门的人数。
就是这样:
peopleCount    depId deptName
25                     1       人力资源部
42                     2       市场营销部
一、分组的失败
首先说说分组的概念。根据关系数据库理论,分组的概念是(G,·,e ),其中G是聚集,·是二目运算,e是G的一个成员,SELECT和GROUP BY的关系如下:
(一)当使用聚集函数(例如count),对于SELECT 列表中的项,如果没有把它当做聚集函数的参数使用,必须是分组的一部分,例如有一个SQL语句:
SELECT depId
       ,
count(*as peopleCount
FROM Employee
那就必须在GROUP BY中出现deptId:
SELECT depId
       ,
count(*as peopleCount
FROM Employee 
GROUP BY depId
但是窗口函数是例外的,不必(也不能)出现在Group BY子句中。
而对于可能更改分组(或者聚集函数返回值,例如新的列),则一定要包含在GROUP BY子句之中。否则就会报错。
二、窗口函数
知道了分组的基本概念之后,理解窗口函数就容易了,与聚集函数一样,窗口函数也是针对元组(就是行)进行聚集,但是不像聚集函数那样只返回一个值(也就是聚集所有行,然后计算),窗口函数可以为每个分组返回多个值。执行聚集的元组(行组)是窗口。
例如第一个代码:select count(*) as cnt from Employee 这很容易,只返回一行,但是往往需要从不表示聚集或者其他聚集的行中访问这种聚集数据,窗口函数就解决了这个问题。例如下面的SQL语句表示用窗口函数从细节行访问聚集数据,就是员工总数:
SELECT EnglishName
       ,deptId
       ,
count(*over() as peopleCount
FROM Employee
ORDER BY 2
OVER关键字表明,把Count当成窗口函数,对于查询返回的每一行,它返回了表中所有行的计数,括号表示还可以接收一些条件来限定行数,即多一层聚集。
三、partition的使用
partition就可以成为那个括号中的条件,它能够定义行的分区或者分组,以完成聚集。空的括号表示分区是整个结果集。partition by是一个移动的GROUP BY,例如:
SELECT EnglishName
       ,depId
       
count(*over(partition by deptId) as peopleCount
FROM Employee
ORDER BY 2
通过partition by depId,为每个部门执行count同一个部门的每个count值相同。所以会返回很多相同的行,这时可以通过内联视图的方式进行解决:
SELECT DISTINCT EnglishName
                ,depId
                ,peopleCount
FROM
    (
SELECT EnglishName
            ,depId
            ,
count(*over(partition by depId) as peopleCount
     
FROM Employee
     
ORDER BY 2
    ) x
如果要在Access中使用,由于Access不支持窗口函数,只能使用标量子查询,代码如下:
ContractedBlock.gifExpandedBlockStart.gifCode
SELECT DISTINCT EnglishName
                ,depId
                ,peopleCount
FROM
    (
SELECT e.EnglishName
            ,e.depId
            ,(
select count(*from emp d where e.depId=d.depId) as peopleCount
     
FROM Employee e,Department d
     
ORDER BY 2
    ) x
需要指出的是,窗口函数经过了数据库专门的优化,所以性能较为优异,比标量子查询要好,所以应当尽量使用。

转载于:https://www.cnblogs.com/tyrael007/archive/2009/04/21/1440831.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练

图源:pixabay原文来源:arXiv原文链接:https://arxiv.org/pdf/1803.10122.pdf作者:David Ha、Jurgen Schmidhuber「雷克世界」编译:嗯~是阿童木呀、KABUDA我们探索构建通用强化学习环境中的生成式神经网络模型。我们的世…

Linux文件空洞与稀疏文件

From:http://www.topjishu.com/8277.html From:http://blog.csdn.net/clamercoder/article/details/38361815 Linux_File_Hole_And_Sparse_Files 参考unix环境高级编程第三版 54页和90页!!! ( 文件I/O章节 lseek…

西人马聂泳忠:打造机器神经系统,成为中国的特斯拉

作者:于绍洋 来源:投资家网经常穿梭于几个城市,一手拉着行李箱,一手忙于回复工作上的事务,这可能已经成为西人马FATRI(下称,西人马)创始人聂泳忠博士的日常状态。他给人的第一印象…

Linux dd 命令

From:http://www.cnblogs.com/jikexianfeng/p/6103500.html Linux/UNIX: 使用 dd 命令创建 1GB 大小的二进制:http://www.linuxidc.com/Linux/2014-12/110147.htm 菜鸟教程 Linux dd命令:http://www.runoob.com/linux/linux-comm-dd.html …

Nature 首度揭示大脑传递信息的真正逻辑

我们对于大脑的理解还停留在极为初步的阶段(图片来源:Pixabay)来源:生物360摘要:我们过去对于大脑处理信息的理解,其实是非常片面和不准确的。今日,一项重量级的研究刊登在了最新一期的《自然》…

Linux 用户 和 用户组 管理 (添加、删除、修改)及说明

From:http://www.cnblogs.com/xd502djj/archive/2011/11/23/2260094.html 鸟哥官网 Linux 帐号管理与 ACL 权限设定:http://linux.vbird.org/linux_basic/0410accountmanager.php 鸟哥官网(简体中文):http://cn.linux.…

IBM Watson将成为失败的投资?分析师眼里, IBM AI过度乐观, 夸大宣传

来源:36Kr 作者:石筱玉IBM Watson是在医疗领域最早布局的AI之一。在36Kr此前的盘点中,我们也知道Watson希望参与患者诊疗中的每一个步骤:导医用智能音箱、Watson诊断工具、住院看护辅助,还有病患心理疏导……Watson已…

linux 文件系统详解

From:http://soysauce93.blog.51cto.com/7589461/1715655 From:http://blog.csdn.net/new0801/article/details/63687127 Linux 的虚拟文件系统(强烈推荐):http://blog.csdn.net/heikefangxian23/article/details/51579971 鸟哥 Linux 磁盘…

国际互联网协会(ISOC)提出未来互联网十项原则

来源:腾讯研究院此前,国际互联网协会(Internet Society,简称ISOC)发布了题为《通往数字化未来之路(Paths to Our Digital Future)》的报告,就数字化未来的道路进行了探索。ISOC认为&…

Spring Data JPA 从入门到精通~javax.persistence概况介绍

虽然 Spring Data JPA 已经对数据的操作封装的很好了,约定大于配置的思想,帮我们默认了很多东西。JPA(Java 持久性 API)是存储业务实体关联的实体的来源,它显示了如何定义一个面向普通 Java 对象(POJO&…

Linux安装配置类似mac下的docky

百度经验:ubuntu安装配置类似mac下的docky 亲手打造自己的Linux桌面环境:http://os.51cto.com/art/201510/493896_all.htm Dock是一种图形用户界面元素,允许用户一键访问常用的应用程序,在应用程序之间快速切换,以及…

埃森哲:2018年科技愿景

来源:199IT互联网数据中心埃森哲近日发布了新报告“2018年科技愿景”,分析了五大技术趋势让企业能够挖掘潜力,创造新的商业机会并帮助改变我们所知道的世界。1公民AI(人工智能)AI随处可见,在整个社会范围内…

java 导出excel教程_Java导出Excel表格

Java导出Excel表格 导出Excel表格需要一个poi-3.9.jar的包,该包在网上可以找到。第一步,创建Excel对象。 HSSFWorkbook workbook new HSSFWorkbook();创建一个工作表。 HSSFSheet sheet workbook.createSheet("日常收入报表");创建合并单元格…

大数据竞赛平台——Kaggle 入门

From:http://blog.csdn.net/u012162613/article/details/41929171 大数据竞赛平台——Kaggle 入门篇 这篇文章适合那些刚接触Kaggle、想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间…

俄罗斯智库 | 人工智能在军事领域的发展现状及应用前景

本文来自:知远战略与防务研究所原文来自:俄罗斯外交和国防政策委员会网站人工智能在军事领域的发展现状及应用前景本文主要介绍了当今世界及俄罗斯本国人工智能技术发展的现状以及未来该技术在军事领域的应用前景,文章还重点分析了人工智能技…

Internet Explorer 8 使用技巧(3):安全上网

如何上网更安全? 听说过“网络钓鱼”吗?最简单的例子:有不法分子模仿真实的银行网站做了个一模一样的,然后通过邮件或其他方式骗你登录并输入银行账号和密码,结果信息泄露,钱被盗走——这就是最典型的“钓鱼…

java 常量折叠_深入理解Java虚拟机之早期编译器优化

Javac编译器Javac编译器是一个由Java语言编写的程序Javac的源码与调试从Sun Javac的代码来看,编译器大致分为3个过程:解析与填充符号表的过程插入式注解处理器的注解处理过程分析与字节码生成的过程Javac编译动作的入口为com.sun.tools.javac.main.JavaC…

Spring Data JPA 从入门到精通~JpaRepository介绍

从 JpaRepository 开始的子类,都是 Spring Data 项目对 JPA 实现的封装与扩展。JpaRepository 本身继承 PagingAndSortingRepository 接口,是针对 JPA 技术的接口,提供 flush()、saveAndFlush()、deleteInBatch()、deleteAllInBatch() 等方法…

深入理解程序从编译到运行

From:http://blog.chinaunix.net/uid-22327815-id-3540305.html 从 Hello World 说程序运行机制:http://www.sohu.com/a/132798003_505868 C/C 中如何在 main() 函数之前执行一条语句?:https://www.zhihu.com/question/26031933 …

技术力量 | 社会计算与计算社会: 智慧社会的基础与必然

来源:智慧城市决策参考摘要:基于社会计算,智慧社会可充分利用开放流动的大数据资源, 综合协调人、地、事、物和组织等各种要素, 形成信息对称、权利对等、扁平化组织的社会结构, 推动传统社会管理模式向分布式、集约化、信息化、智能化、全响…