(select t.*, row_number() over(partition by 分组字段 order by 排序字段 desc ) rn
from tablename t )
where rn=1
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
看几个SQL语句:
语句一:
select row_number() over(order by sale/cnt desc) as sort, sale/cnt
from (
select -60 as sale,3 as cnt from dual union
select 24 as sale,6 as cnt from dual union
select 50 as sale,5 as cnt from dual union
select -20 as sale,2 as cnt from dual union
select 40 as sale,8 as cnt from dual);
执行结果:
SORT SALE/CNT
---------- ----------
1 10
2 5
3 4
4 -10
5 -20
语句二:查询员工的工资,按部门排序
select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;
执行结果:
ENAME SAL SAL_ORDER
-------------------- ---------- ----------
KING 5000 1
CLARK 2450 2
MILLER 1300 3
SCOTT 3000 1
FORD 3000 2
JONES 2975 3
ADAMS 1100 4
SMITH 800 5
BLAKE 2850 1
ALLEN 1600 2
TURNER 1500 3
WARD 1250 4
MARTIN 1250 5
JAMES 950 6
已选择14行。
语句三:查询每个部门的最高工资
select deptno,ename,sal from
(select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
from scott.emp) where sal_order <2;
执行结果:
DEPTNO ENAME SAL
---------- -------------------- ----------
10 KING 5000
20 SCOTT 3000
30 BLAKE 2850
已选择3行。
语句四:
select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;
执行结果:
DEPTNO SAL RANK_ORDER
---------- ---------- ----------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 4
30 1600 5
30 2850 6
已选择14行。
语句五:
select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;
执行结果:
DEPTNO SAL DENSE_RANK_ORDER
---------- ---------- ----------------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 3
30 1600 4
30 2850 5
已选择14行。
语句六:
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;
执行结果:
DEPTNO ENAME SAL LAG_
---------- -------------------- ---------- --------------------
10 CLARK 2450
10 KING 5000 CLARK
10 MILLER 1300 KING
20 ADAMS 1100
20 FORD 3000 ADAMS
20 JONES 2975 FORD
20 SCOTT 3000 JONES
20 SMITH 800 SCOTT
30 ALLEN 1600
30 BLAKE 2850 ALLEN
30 JAMES 950 BLAKE
30 MARTIN 1250 JAMES
30 TURNER 1500 MARTIN
30 WARD 1250 TURNER
已选择14行。
相关推荐
- **MIN() 和 MAX()**:这两个函数主要用来获取每组的最小值和最大值。例如,查询入职日期最早的日期和最晚的日期。 ```sql SELECT MIN(hiredate), MAX(hiredate) FROM emp; ``` - **SUM() 和 AVG()**:分别...
- `MIN()` 和 `MAX()`: 找到最小值和最大值。 3. **移动函数**: - `LEAD()`: 提取当前行之后的值。 - `LAG()`: 提取当前行之前的值。 - `FIRST_VALUE()`: 获取窗口内的第一个值。 - `LAST_VALUE()`: 获取窗口...
以上是对Oracle系统内置函数大全的知识点介绍,内容涵盖了字符处理、数字计算、日期处理、数据类型转换、分组聚合等多个方面的函数。Oracle数据库管理员和开发人员经常需要用到这些函数以实现各种数据处理需求。
聚组函数在SQL查询中用于汇总数据,如`COUNT`计数,`SUM`求和,`AVG`计算平均值,`MIN`和`MAX`找出最小和最大值,以及`GROUP BY`语句配合使用这些函数进行分组。 6. 分析函数: 分析函数允许在数据分组后进行更复杂...
通过熟练运用这些语句,可以实现复杂的数据分析和管理任务,无论是简单地获取数据,还是进行聚合计算,甚至是高级的多表连接和分组分析,Oracle SQL都能提供强大支持。在实际工作中,根据需求灵活组合使用这些语句,...
Oracle数据库中的分组函数是数据分析和查询的重要工具,它们能够对一组数据进行操作并返回一个汇总值。在Oracle公司的内部数据库培训资料Les05中,重点讲解了如何使用这些功能来提升数据处理效率。 首先,组函数的...
5. **聚合函数**:SUM、AVG、MAX、MIN和COUNT等用于对一组值进行计算,如求和、平均值、最大值、最小值和计数。 6. **子查询**:嵌套在其他查询中的查询称为子查询,可以用于比较、过滤或获取满足特定条件的数据。 ...
多行函数处理多行数据并返回一个结果,例如计算平均值、计数、最大值、最小值和总和。 - **AVG()**: 计算平均值。 - **COUNT()**: 统计行数。 - **MAX()**: 找到最大值。 - **MIN()**: 找到最小值。 - **SUM...
聚合函数(Aggregate Functions)如COUNT、SUM、AVG、MAX和MIN等,可以帮助我们对一组值进行统计计算,例如计算总和、平均值、最大值和最小值。配合GROUP BY语句,可以实现按分组统计。 窗口函数(Window Functions...
2. **聚合函数**:COUNT、SUM、AVG、MAX、MIN等聚合函数用于对一组值进行统计计算,例如计算行数、求和、平均值、最大值和最小值。 3. **连接查询**:JOIN操作允许将多个表的数据结合在一起,如INNER JOIN(内连接...
2. **前N条查询**:分析函数允许你快速获取每个分组的前N个最大或最小值,这对于排名和过滤数据非常有用。例如,可以找出每个地区销售业绩最好的前5名员工。 - **例1**:通过RANK()函数,可以为每个分组内的行分配...
`MAX()`返回最大值,`MIN()`返回最小值,`AVG()`计算平均值,`SUM()`求和,如在例4-1中所示,查询最高价、最低价、平均价和库存总量。`COUNT()`则用来计算行数,例如在例4-2中,它用于计算每种商品类别的商品总数。 ...
4. **组函数**:这些函数用于处理一组行,如COUNT(计算行数)、SUM(求和)、AVG(平均值)、MAX(最大值)和MIN(最小值)。它们通常与GROUP BY子句一起使用,根据一个或多个列对结果集进行分组。 5. **多表查询*...
- `MAX()` 和 `MIN()`:找到最大值和最小值。 6. **分组和排序函数** - `GROUP BY`:根据一个或多个列对数据进行分组。 - `ORDER BY`:对结果集进行排序。 - `RANK()`, `DENSE_RANK()` 和 `ROW_NUMBER()`:在...
2. **MIN** 和 **MAX**: 分别找到指定列的最小值和最大值。 3. **AVG**: 计算指定列的平均值。 4. **COUNT**: 统计满足条件的行数。 **排名和分组函数**: 5. **RANK**: 为每个组内的行分配一个唯一的排名,如果有...
例如,`OVER (PARTITION BY name ORDER BY cj DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)`这个表达式会计算`name`分组内所有行的`cj`值的最大值和最小值。 需要注意的是,使用分析函数时应...
统计函数是SQL中强大的功能,包括COUNT()用于计算行数,AVG()用于计算平均值,SUM()用于求和,MAX()和MIN()用于找出最大值和最小值。这些函数在数据分析和报表生成中非常实用。 在更复杂的查询中,可能需要涉及多表...
2. **聚合函数**:如COUNT、SUM、AVG、MAX和MIN,它们用于计算一组值的总数、总和、平均值、最大值和最小值。 3. **子查询**:在查询中嵌套另一个查询,以满足更复杂的条件或获取中间结果。 4. **DML操作**:...
2. 分组和聚合:`GROUP BY`对数据分组,`COUNT()`、`SUM()`、`AVG()`、`MAX()`、`MIN()`为聚合函数,计算计数、总和、平均值、最大值和最小值。 3. 连接查询:`JOIN`用于连接多张表,如`INNER JOIN`、`LEFT JOIN`、...
6. AVG() / SUM() / MAX() / MIN():这些聚合函数在分析上下文中也可以用作分析函数,返回每个分区的平均值、总和、最大值或最小值。 四、实际应用案例 1. 分区排名:计算每个部门员工的薪水排名。 ```sql SELECT ...