原题:

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

  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. ECMA中的switch语句

    switch借鉴自其他语言,但也有自己的特色. 1.可以在switch语句中使用任何数据类型(数值.字符串.对象等),很多其他语言中只能使用数值. 2.每个case的值不一定是常量,可以是变量或者表达 ...

  2. python学习之函数

    1.函数名可以被赋值 比如: def aaa(): pass b = aaa//将函数名字赋值给b b()//跟aaa()效果一样 2.return 2.1.如果函数不写return的话,会默认返回N ...

  3. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  4. cpu主频信息

    yangkunvanpersie ( yangkunvanpersie@163.com ) 通过"有道云笔记"邀请您查看以下笔记 修改CPU频率.note   打开笔记 kerne ...

  5. 某预约系统分析 > 某区公共自行车租车卡在线预约,关于如何提高成功概率

    概诉 网上提交预约申请单,线下面交完成实体卡的交付和办理. 本文主要从技术角度分析预约页面,仅供初学者技术交流使用. 表单输入和校验 系统通过2步的确认点击到达信息输入页面. 地址:/bjggzxc/ ...

  6. 【leetcode❤python】 168. Excel Sheet Column Title

    class Solution(object):    def convertToTitle(self, n):        """        :type n: in ...

  7. XFire完整入门教程

    网上关于XFire入门的教程不少,要么是讲得很简单,就像Hello World一样的程序,要么就是通过IDE集成的工具来开发的,这对于不同的人群有诸多不便,关于XFire的一些详细的信息就不再多讲,可 ...

  8. dev LayoutControl布局控件

    标题长短不一致,很难看 设置LayoutControl属性 效果: 修改字体: 控件字体: LayoutControl→Appearance→Control→Font→FontSize  (Contr ...

  9. Object-C

    #import <Foundation/Foundation.h> #pragma mark 狗类的声明 @interface Dog:NSObject { @public NSStrin ...

  10. miniprofiler对方法的时间性能检测

    miniprofiler对方法的时间性能检测 直接上代码 using StackExchange.Profiling; ... var profiler = MiniProfiler.Current; ...