`
郑云飞
  • 浏览: 813903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle partition by与group by 的区别

 
阅读更多
SELECT   b,   c,   d,SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a  

  

今天看到一个老兄的问题,
大概如下:
查询出部门的最低工资的userid 号
表结构:

D号      工资      部门 
userid salary   dept 
1      2000      1 
2      1000      1 
3      500       2 
4      1000      2 
 

有一个高人给出了一种答案:
SELECT MIN (salary) OVER (PARTITION BY dept ) salary, dept    
FROM ss 

 
运行后得到:
1000 1 
1000 1 
500 2 
500 2 
 
楼主那位老兄一看觉得很高深。大叹真是高人阿~
我也觉得这位老兄实在是高啊。

但我仔细研究一下发现那位老兄对PARTITION BY的用法理解并不深刻。并没有解决楼主的问题。
大家请看我修改后的语句
SELECT userid,salary,dept,MIN (salary) OVER (PARTITION BY dept ) salary   
FROM ss 

 
运行后的结果:
userid   salary dept      MIN (salary) OVER (PARTITION BY dept ) 
1 2000 1 1000 
2 1000 1 1000 
3 500 2 500 
4 1000 2 500 

 
大家看出端倪了吧。
高深的未必适合。

一下是我给出的答案:
SELECT * FROM SS 
INNER JOIN (SELECT MIN(SALARY) AS SALARY, DEPT FROM SS GROUP BY DEPT) SS2 
USING(SALARY,DEPT) 

 
运行后的结果:
salary dept     userid 
1000 1 2 
500 2 3 

 
由此我想到总结一下group by和partition by的用法
group by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。

partition by虽然也具有分组功能,但同时也具有其他的功能。
它属于oracle的分析用函数。
借用一个勤快人的数据说明一下:

sum()   over   (PARTITION   BY   ...)   是一个分析函数。   他执行的效果跟普通的sum   ...group   by   ...不一样,它计算组中表达式的累积和,而不是简单的和。  
   
表a,内容如下:  
B C D   
02 02 1   
02 03 2   
02 04 3   
02 05 4   
02 01 5   
02 06 6   
02 07 7   
02 03 5   
02 02 12   
02 01 2   
02 01 23   
    
 
select   b,c,sum(d)   e   from   a   group   by   b,c   
 
 
得到:  
B C E   
02 01 30   
02 02 13   
02 03 7   
02 04 3   
02 05 4   
02 06 6   
02 07 7   
    
 
而使用分析函数得到的结果是:  
SELECT   b,   c,   d,   SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a   
 
B C E   
02 01 2   
02 01 7   
02 01 30   
02 02 1   
02 02 13   
02 03 2   
02 03 7   
02 04 3   
02 05 4   
02 06 6   
02 07 7   
 
结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:   

B C D E   
02 01 2 2                     d=2,sum(d)=2   
02 01 5 7                     d=5,sum(d)=7   
02 01 23 30                   d=23,sum(d)=30   
02 02 1 1                     c值不同,重新累计   
02 02 12 13   
02 03 2 2   
02 03 5 7   
02 04 3 3   
02 05 4 4   
02 06 6 6   
02 07 7 7
 
分享到:
评论
1 楼 dic_1988 2011-09-16  
订单

相关推荐

    ORACLE去除重复数据方法

    - `ROW_NUMBER() OVER (PARTITION BY CONTRACTID ORDER BY ALTER_DATE) AS rn`:此行代码使用`ROW_NUMBER()`函数为每个`CONTRACTID`分组内的记录分配一个行号,按照`ALTER_DATE`升序排列。 2. **最终查询**: - ...

    oracle分组排序统计高级用法

    通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等,可以有效地对数据进行分组、排序、聚合等操作。 #### 二、Oracle分组求Top N的方法 **1. 使用`RANK()`函数** - **基本语法**: `RANK()`函数...

    oracle分析函数.doc

    它们允许用户在单个SQL查询中执行聚合操作,同时保持行的原始顺序,这是传统的GROUP BY函数无法实现的。分析函数的主要优势在于它们能够提供更灵活的数据处理和分析能力,特别适用于OLAP(在线分析处理)系统。 1. ...

    oracle分析函数文档

    在理解Oracle分析函数之前,首先需要了解它与传统的聚合函数(如SUM、AVG等)之间的区别: - **聚合函数**:对一组数据计算一个单一的结果,例如求和、平均值等。 - **分析函数**:可以为每个分组内的每一行数据...

    oracle字段去重

    ##### 3.2 使用GROUP BY与聚合函数 当需要去除包含多个字段的记录中的重复项时,可以使用`GROUP BY`结合聚合函数如`COUNT()`等。 **示例:** 假设有一个员工表`EMPLOYEE`,包含`EMP_ID`, `DEPT_ID`, `NAME`等字段...

    Oracle中分组后拼接分组字符串.pdf

    lead(rnFirst) over(partition by No order by rnFirst) rnNext from ( select a.No, a.Value, a.Name, row_number() over(order by a.No, a.Value desc) rnFirst from Test a ) tmpTable1 ) tmp...

    Oracle9i分析函数参考手册

    分析函数与聚合函数的区别在于,聚合函数如SUM、COUNT等,它们对一组数据进行计算后只返回一行结果,而分析函数则允许对每个分组返回多行,这在处理复杂的报表和数据分析时非常有用。 分析函数的核心概念是“数据...

    oracle10g,9i多行合并一行函数

    ### Oracle 10g与9i中的多行合并为一行函数详解 在Oracle数据库系统中,经常需要将多个行的数据合并成单行显示,尤其是在处理报告或者需要将多个值组合成一个字符串的情况下。本文将详细介绍如何在Oracle 10g与9i...

    ORACLE分析函数

    这个例子中,虽然也使用了`ORDER BY`子句,但是没有使用`PARTITION BY`,这意味着所有的员工将被视为一个整体进行排序。因此,尽管`ORDER BY deptno, ename`会先按部门排序再按员工名字排序,但求和操作是在整个结果...

    oracle函数介绍(5) 分析函数简述.doc

    第五篇 分析函数简述 分析函数的语法结构比较复杂,但多数函数都具有相同的语法...Partition没啥说的,功能强大参数少,主要用于分组,可以理解成select中的group by。不过它跟select语句后跟的group by 子句并不冲突。

    oracle分析函数的使用

    1. 传统的统计函数,如`COUNT()`,通常与`GROUP BY`一起使用来计算每个类别的数量。例如,我们可以计算每个班级的学生数量: ```sql SELECT t.class, COUNT(*) FROM t_student_score t GROUP BY t.class; ``` 如果...

    Oracle高级sql学习与练习

    10. 增强GROUP BY功能,使用GROUP BY扩展选项,如GROUPING SETS、CUBE和ROLLUP等,可以实现更复杂的聚合计算。 11. 分析函数(ANALYTICAL FUNCTIONS)是Oracle SQL的高级特性之一,允许在数据集上进行窗口计算,...

    oracle连续重复行去重

    RANK() OVER (PARTITION BY callid, callerno, calleeno, devicetype ORDER BY waitbegin) - ROW_NUMBER() OVER (PARTITION BY callid, callerno, calleeno, devicetype ORDER BY waitbegin) AS rn FROM billr ...

    Oracle计算连续天数,计算连续时间,Oracle连续天数统计

    GROUP BY a.employee_id, a.attendance_date, b.attendance_date HAVING COUNT(*) > 1 ORDER BY a.employee_id, start_date; ``` 这个查询会找出每个员工连续出勤的开始日期和结束日期,以及连续的天数。 3. **...

    oracle分析函数参考手册

    GROUP BY t.calendar_month_number ORDER BY t.calendar_month_number; ``` **解释**:在这个例子中,`CORR`函数计算了每个月销售收入和单位销售量的相关系数。通过`OVER (ORDER BY t.calendar_month_number)`子句...

    【Oracle】LISTAGG函数的使用.pdf

    LISTAGG(合并字段, 连接符) WITHIN GROUP(ORDER BY 合并字段的排序) OVER(PARTITION BY 分组字段) 2. 作为聚合函数,类似于 sum()、count()、avg() 等函数,使用方法相似: LISTAGG(合并字段, 连接符) WITHIN ...

    oracle去重复

    - `ROW_NUMBER() over (partition by a.term_id order by a.user_deptno) rk`: 行号rk的计算基于`term_id`分组,按`user_deptno`升序排序。 2. **外层查询**: 然后,通过`t2.rk = 1`条件筛选出每个分组的第一条...

    ORACLE分析函数.pdf

    GROUP BY ROLLUP(BILL_MONTH, AREA_CODE, NET_TYPE); ``` CUBE与ROLLUP类似,但它不仅生成子集,还生成所有可能的组合,包括空的组合(即没有BILL_MONTH、AREA_CODE或NET_TYPE的情况)。 2. 排序函数 (RANK, DENSE...

Global site tag (gtag.js) - Google Analytics