由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…

Spring Data JPA 从入门到精通~@Modifying修改查询

学习思路一样,我们先看源码: public interface Modifying { //如果配置了一级缓存,这个时候用clearAutomaticallytrue,就会刷新hibernate的一级缓存了, 不然你在同一接口中,更新一个对象,接着查询这个对象…

java volatile修饰引用_关于volatile修饰引用类型的疑惑

volatile修饰引用类型能否保证可见性似乎一直没有一个定论,有的书中说仅能保证引用本身的可见性,下面用两段代码来验证:流程基本为一个线程死循环读取某个引用类型的某个变量的值,另一个线程修改这个值,观察线程是否结…

gridview 简单的分页

allowpaging 设为 true 然后 后台代码为: protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex e.NewPageIndex; Get_Gridview(); } Get_Gridview();是绑定gridview 的方法 转载于:https…

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

作者:于绍洋 来源:投资家网经常穿梭于几个城市,一手拉着行李箱,一手忙于回复工作上的事务,这可能已经成为西人马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 …

Ubuntu 20.04 (Focal Fossa) 上安装RabbitMQ和Erlang,并配置管理员,并且修改数据目录

本脚本适用于在Ubuntu 20.04 (Focal Fossa) 上在线快速安装RabbitMQ和Erlang。 快速安装脚本: #!/bin/shsudo apt-get install curl gnupg apt-transport-https -y## Team RabbitMQs main signing key curl -1sLf "https://keys.openpgp.org/vks/v1/by-finge…

javascript indexOf函数

使用方法:strObj.indexOf(str,startIndex[可选]) 程序代码 其中strObj是必选项。String 对象或文字。 str是必选项。要在 String 对象中查找的子字符串。 startIndex是可选项。该整数值指出在 String 对象内开始查找的位置,从0开始。如果省略&#xff0c…

Spring Data JPA 从入门到精通~@Procedure 储存过程的查询方法

我们通过 Procedure 来介绍一下,JPA 对储存过程的支持。 (1)Procedure 源码如下: public interface Procedure {// 数据库里面储存过程的名称String value() default "";// 数据库里面储存过程的名称String procedure…

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.…

java+long是什么_Java中long的模运算符是什么? - java

如何在Java中找到两个长数值的模(%)?我的代码说“整数太大”,后面跟我要修改的数字。我尝试将其强制转换很长时间,但没有成功。我是否必须将其转换为BigInteger并使用剩下的方法?谢谢。参考方案%运算符确实可以工作很长…

发现一个奇怪的问题: 不能把文件取名为 con

在 XP 系统下不能建立叫 con 的文件! 不知其他朋友也是这样? 转载于:https://www.cnblogs.com/del/archive/2009/04/26/1444175.html

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

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

Spring Data JPA 从入门到精通~@NamedQueries预定义查询

这种是预定义查询的一种形式 (1)在 Entity 下增加 NamedQuery 定义。 public interface NamedQuery {//query的名称,规则:实体.方法名;String name();//具体的JPQL查询语法String query(); } 需要注意,这…

jsp+servlet+java 实现统计在线人数

首先&#xff1a;jsp ----------------------------index.jsp 我要现在index.jsp 写一段 JavaScript <html> <head> <script type"text/javascript"> window.onbeforeunload function() //author: meizz { var n window.event.screenX - …

linux 文件系统详解

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

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

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

不错的html学习网址。

http://htmlplayground.com/ 转载于:https://www.cnblogs.com/techfootsprints/archive/2009/04/28/1445774.html