原题:

集团中有多个部门,部门底下有多个员工,求每个部门绩效分数排名第二的人员,数据表结构如下:

  DEPAR          NAME             SCORE

A                   A1                  66

A                   A2                  80

A                   A3                  55

B                   B3                  36

B                   B3                  78

C                   C3                  57

C                   C3                  92

这是某公司笔试题,朋友问我的时候,我觉得挺好玩,然后直接就顺着思路写出来答案,

首先把各部门第一名排除掉,那么在求业绩的max就是每个部门的第二名,sql如下:

SELECT MAX([SCORE]) AS DSECOND,DEPAR FROM [DEPARSCORE]
WHERE [SCORE] NOT IN
(
(SELECT MAX([SCORE])
FROM [DEPARSCORE] group by depar)
)
GROUP BY DEPAR

查询结果,ok,棒极了

可是朋友说好像有哪里不对,我又试了试把数据改成了这样

再次查询试试

那么B的第二名去哪里了,这条sql确实是有bug的,但是错在哪里了,

我分析了一下,我觉得是 WHERE [SCORE] NOT IN 出的问题,

首先查询各部门第一名结果如下:

A80,B90,C20,然后SCORE NOT IN 得到的应该是

A66,A55,C20

问题就出来了,B部门的第二名去哪了呢,原因是SCORE NOT IN (80,90,20),那B部门的第二名当然就出不来了啊。

因为B的第二名分数正好等于A的第一名的分数,我们判断分数不等于A的第一名,那同时也不等于B的第二名。

所以说单纯的判断分数不等于之外还要加上部门判断,那怎么判断呢:

我决定这样

SELECT MAX([SCORE]) AS DSECOND,DEPAR FROM [DEPARSCORE]
WHERE [SCORE] NOT IN
(
(SELECT MAX([SCORE],DEPAR)
FROM [DEPARSCORE] group by depar) AS B
) AND [DEPARSCORE].DEPAR=B.DEPAR
GROUP BY DEPAR

哈哈,很明显不对,因为not in不可能跟着两个字段啊

消息 116,级别 16,状态 1,第 6 行
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。

我很头疼,如果不用not in ,我想不出来如何做,试着百度了一下not in 发现一片文章可以替代not in,

我就试试

http://blog.csdn.net/shenyisyn/article/details/544694

于是就有了这段sql

select aa.*,bb.DSECOND as tempcolum from
(SELECT [SCORE],DEPAR FROM [DEPARSCORE]) as aa
left join (SELECT MAX([SCORE]) AS DSECOND,DEPAR
FROM [membdatabases_bak].[dbo].[DEPARSCORE] group by depar )as bb on aa.[SCORE]=bb.DSECOND
and aa.DEPAR=bb.DEPAR

结果如下

这时候可以看出来,除了第一名之外的所有列tempcolum都为null

然后以tempcolum is null为条件查出来

得到了各部门除第一名之外的所有数据

然后

select MAX(SCORE),DEPAR from (
select aa.*,bb.DSECOND as tempcolum from
(SELECT [SCORE],DEPAR FROM [DEPARSCORE]) as aa
left join (SELECT MAX([SCORE]) AS DSECOND,DEPAR
FROM [membdatabases_bak].[dbo].[DEPARSCORE] group by depar )as bb on aa.[SCORE]=bb.DSECOND
and aa.DEPAR=bb.DEPAR) as dd where tempcolum is null GROUP BY DEPAR

然后就成功了

好嗨森,哈哈,今天没辜负。哈哈

这种替代not in 的方法可以好好记住!!

每个部门绩效成绩第二名 sql server 查询 ( 替代 not in )的更多相关文章

  1. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  2. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  3. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  4. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  5. 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  6. 如何找出你性能最差的SQL Server查询

    我经常会被反复问到这样的问题:”我有一个性能很差的SQL Server.我如何找出最差性能的查询?“.因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导. 问SQL Server! SQL ...

  7. 使用WinDbg调试SQL Server查询

    上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们 ...

  8. sql server 查询分析器消息栏里去掉“(5 行受影响)”

    sql server 查询分析器消息栏里去掉"(5 行受影响)"     在你代码的开始部分加上这个命令: set nocount on   记住在代码结尾的地方再加上: set ...

  9. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

随机推荐

  1. 《编写可维护的JavaScript》——JavaScript编码规范(六)

    变量.函数和运算符 在讨论过基本的JavaScript书写格式化之后,接下来关注如何使用函数.变量和运算符来减少复杂度和增强可读性就显得十分重要了. 变量声明 变量声明是通过var语句来完成的.var ...

  2. IOS textView获取光标定位,以及选中

    当textview成为第一响应者的时候就会调用一个协议方法 - (void)textViewDidChangeSelection:(UITextView *)textView; 在这个协议方法中可以实 ...

  3. C语言-循环结构及break、continue

    循环结构 --1-- 结构循环 1.1 while循环 1.2 do…while循环 1.3 for循环 --2-- break和continue 2.1 break关键字 2.2 continue关 ...

  4. Java 异常处理 练习2

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  5. 双层路由设置,WAN口和LAN口连接的方法设置

    WAN口设置方法,社路由器分别为路1 和路2 1 路2的LAN口地址改为172.16.1.1,重启 2 笔记本改成172.16.1.X,然后进入设置,在里面WAN地址设置为静态地址 192.168.1 ...

  6. 使用 Python 切割图片

    刚好我有张 PNG 图片需要均匀切割,刚好我不会 PhotoShop,刚好我想用 Python 来练练手. 于是撸袖子码脚本. import os from PIL import Image def ...

  7. Socket TCP之keepalive

    摘自: http://machael.blog.51cto.com/829462/211989/

  8. Mifare系列5-存储结构(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38081521 Mifare S50把1K字节的容量分为16个扇区(Sector0 ...

  9. T-SQL编程 —— 用户自定义函数(内嵌表值函数)

    内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...

  10. OpenCV2+入门系列(二):图像的打开、创建与显示(命令行)

    前置知识:数字图像的简略知识 这里只是最基础的知识,上课如果稍微听了课的同学可以直接略过不不看. 彩色图像: 对于一副数字图像,对于一副RGB色彩空间的彩色数字图像,它一共有宽X高个像素格子,每个格子 ...