原题:

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

  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. mysql explain执行计划详解

      1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simp ...

  2. javascript高级程序设计第5章,引用类型

    object类型: 创建object实列的方式有两种,一种是new()方法,一种是对象字面量表示法: 第一种法方:  var obj = new object(); obj.name = 'name' ...

  3. java主函数的含义

    下面对java中的主函数进行简单的解释,解决可能困惑大家的问题,下面举的例子在实际开发中几乎不会出现,但是为了解决好奇心,大家可以这么去尝试一下! 我们在java中看到的主函数通常是这样的:publi ...

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

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

  5. angular源码阅读的起点,setupModuleLoader方法

    angular源码其实结构非常清晰,划分的有条有理的,大概就是这样子: (function(window,document,jquery,undefined){ //一些工具函数 //EXPR 编译器 ...

  6. 通过js给android控件WebView设padding

    项目中有个界面是用来显示一个网页的,很简单,放个WebView就ok了,可是返回按钮放在哪 ,ui的设计是在底部显示一个半透明的条,左边有一个返回按钮.这个条显示在内容上面.我有一个担心,就是要是最下 ...

  7. 前端中sprite.png的实现

    通过background-position来控制X轴和Y轴,从而实现显示sprite.png中想要的ico或图案. 如下图所示:

  8. 俄罗斯画师Mikhail Rakhmatullin作品

  9. .net 网站开发学习资源

    慕课网 前端基础学习 http://www.imooc.com/course/list?c=fe 了解需求 例子之一 http://wenku.it168.com/d_000517899.shtml ...

  10. Java知识积累1-StringAlign实现文字居中左右对齐

    import java.text.*;public class StringAlign extends Format{ public static final int JUST_LEFT='l'; / ...