`
53873039oycg
  • 浏览: 843879 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]oracle 按部门分组取每部门薪水最大的2条记录

 
阅读更多

       最近看到的一篇帖子http://www.itpub.net/forum.php?mod=viewthread&tid=1865269按部门分组取薪水最大的2条记录,原帖给出的答案

      

select *
  from emp t
 where (select count(1) + 1
          from emp
         where nvl(deptno,0) = nvl(t.deptno,0)
           and nvl(sale,0) > nvl(t.sale,0)) <= 2

    结果为

   

   

     Emp表按部门分组,按薪水排列结果如下

     可以看到原帖的答案没有考虑到有null值情况,考虑空值的sql为

    

select *
  from emp t
 where (select count(1) + 1
          from emp
         where nvl(deptno,0) = nvl(t.deptno,0)
           and nvl(sale,0) > nvl(t.sale,0)) <= 2
  order by deptno,sale desc nulls last

    结果为

   

 

       或者使用分析函数

      

select *
  from (select emp.*,
               dense_rank() over(partition by deptno order by sale desc nulls last) rn
          from emp)
 where rn <= 2;

   

     检验2个结果是否相同

    

select t.empno
  from emp t
 where (select count(1) + 1
          from emp
         where nvl(deptno,0) = nvl(t.deptno,0)
           and nvl(sale, 0) > nvl(t.sale, 0)) <=2
minus
select t.empno
  from (select emp.*,
               dense_rank() over(partition by deptno order by sale desc nulls last) rn
          from emp) t
 where rn <= 2;

select t.empno
  from (select emp.*,
               dense_rank() over(partition by deptno order by sale desc nulls last) rn
          from emp) t
 where rn <= 2
minus
select t.empno
  from emp t
 where (select count(1) + 1
          from emp
         where nvl(deptno,0) = nvl(t.deptno,0)
           and nvl(sale, 0) > nvl(t.sale, 0)) <= 2

   

    欢迎提出更好的sql写法,谢谢

 

     全文完。

 

  • 大小: 19.1 KB
  • 大小: 18.3 KB
  • 大小: 16 KB
0
0
分享到:
评论

相关推荐

    oracle中scott账户下的表

    在Oracle数据库中,SCOTT账户是一个经典...这些表提供了关于公司组织结构、员工信息和薪酬结构的简单模型,非常适合初学者学习SQL查询、连接、分组等操作。通过练习查询这些表,可以熟悉Oracle数据库的管理和数据操作。

    Oracle练习题

    第一种是首先计算每个部门的平均薪水并按降序排列,然后选取第一个记录;第二种是先计算平均薪水,再使用聚合函数找到最大平均薪水,最后将这两个结果关联。这两种方法都利用了`ROWNUM`伪列来选取最高值。 通过这些...

    Oracle 经典查询练手

    为了找出至少有一个员工的所有部门,我们需要连接`emp`表和`dept`表,并且确保只选择那些在`emp`表中有记录的部门。可以使用内连接(INNER JOIN)来实现这一目标。 **SQL语句:** ```sql SELECT d.DEPTNO, d.DNAME ...

    oracle分析函数row_number() over()使用

    此外,我们还可以通过改变`ORDER BY`子句的顺序或添加额外的条件,来创建不同的分析效果,如按薪水从高到低对部门内员工进行累计,或者按部门和薪水的降序排列整个公司员工的薪水。 总之,Oracle的row_number() ...

    oracle练习题.zip

    例如,找出每个部门的平均薪水: ```sql SELECT Department, AVG(Salary) AS AverageSalary FROM Employees GROUP BY Department; ``` 2. **插入数据**:使用`INSERT INTO`语句向表中添加新记录。例如: ``...

    【转载】oracle笔试2.doc

    在Oracle数据库中,外连接(Outer Join)是用于查询数据时合并两个或多个表的记录,即使其中一个表中没有匹配的记录。这个问题涉及到对不同类型的外连接的理解,以及Oracle9i之后对外连接语法的支持。 问题1是关于...

    常见Oracle数据库面试题目

    - 使用`HAVING COUNT(*) &gt;= 1`确保每个分组中至少有一条记录。 - 最终查询结果应包含部门编号(`deptno`)。 SQL语句示例: ```sql SELECT deptno FROM emp GROUP BY deptno HAVING COUNT(*) &gt;= 1; ``` #### 2. 列出...

    Oracle练习题及答案(二).doc

    通过`WHERE`子句筛选出职位为"MANAGER"的员工,然后对每个部门的经理薪资进行分组和求最小值。 19. 列出按年薪排序的雇员 这题未给出具体实现,通常可以使用`ORDER BY`对年薪进行排序,年薪可以通过`sal * 12`计算...

    ORACLE分析函数

    例如,如果我们按部门分组并计算每个部门的累计薪水: ```sql SELECT department_id, employee_name, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cumulative_salary FROM ...

    SQL 语法基础入门(ORACLE)

    ` 将数据按部门ID分组,`HAVING total_salaries &gt; 100000;` 过滤掉总薪资小于100000的组。 5. ORDER BY子句:对结果进行排序,如`ORDER BY salary DESC;` 按薪水降序排列。 三、插入数据 使用INSERT语句向表中添加...

    OracleSQL必备参考

    例如,你可以用子查询找出某个部门薪水最高的员工。 3. **连接(JOIN)操作**:在处理多个表的数据时,JOIN操作非常关键。包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL ...

    oracle面试题

    - 使用子查询来获取特定部门的薪金最大值。 - 使用`&gt;`进行比较。 - **SQL语句**: ```sql SELECT ename, sal FROM emp WHERE sal &gt; (SELECT MAX(sal) FROM emp WHERE deptno = 30); ``` #### 13. 列出在...

    Oracle学习文档

    - **解释**: 该SQL语句利用ROWID属性,找出每组数据中的最大ROWID,然后删除不匹配这些ROWID的所有记录,从而达到删除重复记录的目的。 ### 3. TOP N 查询 - **语法**: - `SELECT * FROM (SELECT * FROM emp ORDER...

    oracle 查询列值相同其他信息的信息

    在Oracle中,查询列值相同的记录通常涉及到GROUP BY和HAVING子句,它们可以帮助我们对数据进行分组并筛选出特定条件的组。 例如,假设我们有一个名为`employees`的表,其中包含`employee_id`(员工ID),`...

    Oracle练习笔试大全

    Oracle练习笔试大全 1、select ename, sal * 12 from emp; //计算年薪 2、select 2*3 from dual; //计算一个比较纯的数据用dual表 3、select sysdate from dual; //查看当前的系统时间 4、select ename, sal*12 ...

    Oracle组函数.docx

    这里的 `GROUP BY department_id` 语句指定了按部门进行分组,而 `MAX(salary)` 则计算每个分组的最大薪资。 ### 2. MIN 最小值 与 `MAX` 相反,`MIN` 函数用于查找一组数值中的最小值。它可以帮助我们了解最低...

    Oracle学习心得

    分组函数主要用于处理多条记录,返回一个汇总的结果,这对于数据分析和报表生成非常有用。 1. **Count()函数**:这是最常用的分组函数之一,用于计算特定列的记录数。`COUNT(*)` 返回表中的所有记录数,而 `COUNT...

    Oracle语法实例讲解chm

    7. **排序查询**:使用`ORDER BY`子句对查询结果进行排序,如按薪水降序排列: ``` SELECT * FROM employees ORDER BY salary DESC; ``` 8. **分组查询**:`GROUP BY`用于对数据进行分组,常与聚合函数如`COUNT...

    Oracle公司内部数据库培训资料ppt_part5

    在这个部分,我们将深入探讨Oracle中的分组函数,这些函数对于数据分析和报告至关重要。 分组函数,正如其名,是作用于数据集的一类函数,它们不是针对单行数据,而是对一组数据进行操作,然后返回一个单一的值。...

    Oracle的sql语句练习题及参考答案

    Oracle SQL是用于管理和操作Oracle数据库的强大工具,它允许用户查询、更新、插入和删除数据,以及执行复杂的数据库操作。在“Oracle的SQL语句练习题及参考答案”中,我们很可能会遇到各种与`SELECT`语句相关的练习...

Global site tag (gtag.js) - Google Analytics