最近看到的一篇帖子,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写法,谢谢。
全文完。
相关推荐
在Oracle数据库中,SCOTT账户是一个经典...这些表提供了关于公司组织结构、员工信息和薪酬结构的简单模型,非常适合初学者学习SQL查询、连接、分组等操作。通过练习查询这些表,可以熟悉Oracle数据库的管理和数据操作。
第一种是首先计算每个部门的平均薪水并按降序排列,然后选取第一个记录;第二种是先计算平均薪水,再使用聚合函数找到最大平均薪水,最后将这两个结果关联。这两种方法都利用了`ROWNUM`伪列来选取最高值。 通过这些...
为了找出至少有一个员工的所有部门,我们需要连接`emp`表和`dept`表,并且确保只选择那些在`emp`表中有记录的部门。可以使用内连接(INNER JOIN)来实现这一目标。 **SQL语句:** ```sql SELECT d.DEPTNO, d.DNAME ...
此外,我们还可以通过改变`ORDER BY`子句的顺序或添加额外的条件,来创建不同的分析效果,如按薪水从高到低对部门内员工进行累计,或者按部门和薪水的降序排列整个公司员工的薪水。 总之,Oracle的row_number() ...
例如,找出每个部门的平均薪水: ```sql SELECT Department, AVG(Salary) AS AverageSalary FROM Employees GROUP BY Department; ``` 2. **插入数据**:使用`INSERT INTO`语句向表中添加新记录。例如: ``...
在Oracle数据库中,外连接(Outer Join)是用于查询数据时合并两个或多个表的记录,即使其中一个表中没有匹配的记录。这个问题涉及到对不同类型的外连接的理解,以及Oracle9i之后对外连接语法的支持。 问题1是关于...
- 使用`HAVING COUNT(*) >= 1`确保每个分组中至少有一条记录。 - 最终查询结果应包含部门编号(`deptno`)。 SQL语句示例: ```sql SELECT deptno FROM emp GROUP BY deptno HAVING COUNT(*) >= 1; ``` #### 2. 列出...
通过`WHERE`子句筛选出职位为"MANAGER"的员工,然后对每个部门的经理薪资进行分组和求最小值。 19. 列出按年薪排序的雇员 这题未给出具体实现,通常可以使用`ORDER BY`对年薪进行排序,年薪可以通过`sal * 12`计算...
例如,如果我们按部门分组并计算每个部门的累计薪水: ```sql SELECT department_id, employee_name, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cumulative_salary FROM ...
` 将数据按部门ID分组,`HAVING total_salaries > 100000;` 过滤掉总薪资小于100000的组。 5. ORDER BY子句:对结果进行排序,如`ORDER BY salary DESC;` 按薪水降序排列。 三、插入数据 使用INSERT语句向表中添加...
例如,你可以用子查询找出某个部门薪水最高的员工。 3. **连接(JOIN)操作**:在处理多个表的数据时,JOIN操作非常关键。包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL ...
- 使用子查询来获取特定部门的薪金最大值。 - 使用`>`进行比较。 - **SQL语句**: ```sql SELECT ename, sal FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30); ``` #### 13. 列出在...
- **解释**: 该SQL语句利用ROWID属性,找出每组数据中的最大ROWID,然后删除不匹配这些ROWID的所有记录,从而达到删除重复记录的目的。 ### 3. TOP N 查询 - **语法**: - `SELECT * FROM (SELECT * FROM emp ORDER...
在Oracle中,查询列值相同的记录通常涉及到GROUP BY和HAVING子句,它们可以帮助我们对数据进行分组并筛选出特定条件的组。 例如,假设我们有一个名为`employees`的表,其中包含`employee_id`(员工ID),`...
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 ...
这里的 `GROUP BY department_id` 语句指定了按部门进行分组,而 `MAX(salary)` 则计算每个分组的最大薪资。 ### 2. MIN 最小值 与 `MAX` 相反,`MIN` 函数用于查找一组数值中的最小值。它可以帮助我们了解最低...
分组函数主要用于处理多条记录,返回一个汇总的结果,这对于数据分析和报表生成非常有用。 1. **Count()函数**:这是最常用的分组函数之一,用于计算特定列的记录数。`COUNT(*)` 返回表中的所有记录数,而 `COUNT...
7. **排序查询**:使用`ORDER BY`子句对查询结果进行排序,如按薪水降序排列: ``` SELECT * FROM employees ORDER BY salary DESC; ``` 8. **分组查询**:`GROUP BY`用于对数据进行分组,常与聚合函数如`COUNT...
在这个部分,我们将深入探讨Oracle中的分组函数,这些函数对于数据分析和报告至关重要。 分组函数,正如其名,是作用于数据集的一类函数,它们不是针对单行数据,而是对一组数据进行操作,然后返回一个单一的值。...
Oracle SQL是用于管理和操作Oracle数据库的强大工具,它允许用户查询、更新、插入和删除数据,以及执行复杂的数据库操作。在“Oracle的SQL语句练习题及参考答案”中,我们很可能会遇到各种与`SELECT`语句相关的练习...