`
tianlihu
  • 浏览: 313994 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Oracle分组排序查询

阅读更多
原讨论链接: http://www.itpub.net/thread-1034530-1-1.html

最近遇到一场景:
查询所有账户在某天的最新修改的记录

其中,某些账户在同一天内可能不止修改一次。


把此查询按讨论中简化一下,建一数据表
CREATE TABLE HW
(DEPID NUMBER,
DEPT VARCHAR2(30),
AMOUNT NUMBER);



插入一些测试数据:
INSERT INTO HW VALUES(10,'北京',100);
INSERT INTO HW VALUES(10,'上海',200);
INSERT INTO HW VALUES(10,'南京',300);
INSERT INTO HW VALUES(20,'山东',400);
INSERT INTO HW VALUES(20,'河南',500);
INSERT INTO HW VALUES(20,'河北',600);
INSERT INTO HW VALUES(30,'湖南',700);
INSERT INTO HW VALUES(30,'浙江',800);
INSERT INTO HW VALUES(30,'陕西',900);


查询要求是:
要求用sql查询每个分组中amount最大的前两条记录

这里提供两种查询:一种为不用子查询的方法;另一种是使用子查询的方法

不使用子查询语句为: (简单的分析函数的应用, 分析函数还包括rank()over(),dense_rank()over()等)
SELECT * FROM
(SELECT T.*, ROW_NUMBER() OVER(PARTITION BY DEPID ORDER BY AMOUNT DESC) RN FROM HW T)
WHERE RN < 3


查询的结果是:
     DEPID DEPT                               AMOUNT         RN
---------- ------------------------------ ---------- ----------
        10 南京                                  300          1
        10 上海                                  200          2
        20 河北                                  600          1
        20 河南                                  500          2
        30 陕西                                  900          1
        30 浙江                                  800          2

6 rows selected



使用子查询的语句为:
SELECT *
FROM HW tr
WHERE
(SELECT COUNT(*) FROM HW WHERE tr.DEPID=DEPID AND AMOUNT>tr.AMOUNT)< 2
ORDER BY DEPID, TR.AMOUNT DESC



查询结果是:
     DEPID DEPT                               AMOUNT
---------- ------------------------------ ----------
        10 南京                                  300
        10 上海                                  200
        20 河北                                  600
        20 河南                                  500
        30 陕西                                  900
        30 浙江                                  800

6 rows selected


两种查询各有优缺点:
不用子查询的方法利用了Oracle自身的查询方法,效率会高些,但是给移稙带来不利影响
子查询的优点是可用于任何数据库,但是效率差些




分享到:
评论
1 楼 bureaucrat 2011-04-13  
ROW_NUMBER()是sql:2003标准

相关推荐

    oracle分组排序统计高级用法

    #### 一、Oracle分组排序和统计概述 在Oracle数据库中,实现分组排序和统计是一项常见的需求,主要用于处理大量的数据,并从中提取有价值的信息。通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等...

    oracle索引序列查询分组排序连接视图等PPT教案.pptx

    oracle索引序列查询分组排序连接视图等PPT教案.pptx

    Oracle数据库分组查询练习题(包答案)

    根据提供的信息,我们可以详细解析与Oracle数据库分组查询相关的知识点,并通过具体的练习题目来加深理解。下面将逐一分析每一个题目中的关键知识点。 ### Oracle数据库分组查询知识点详解 #### 1. 查询部门20的...

    Oracle实现对查询结果每N条再次分组博客所用数据库

    标题中的“Oracle实现对查询结果每N条再次分组”是指在Oracle数据库中进行数据处理时,使用SQL语句对查询结果进行分组,而这里的“每N条再次分组”通常指的是使用GROUP BY子句配合ROW_NUMBER()、PARTITION BY等函数...

    oracle处理的类型 oracle行排序

    例如,使用分析函数(如RANK(), DENSE_RANK(), ROW_NUMBER()等)可以实现分组排序,这对处理大数据量的报表或排名场景非常有用。另外,了解并合理运用Oracle的并行查询(Parallel Query)功能,可以在多处理器系统上...

    利用ORACLE实现数据的抽样

    在Oracle中,可以先通过`GROUP BY`对数据进行分组,再从每个分组中随机选取记录,以此来模拟整群抽样的效果。 #### 4. 分层抽样 分层抽样是将总体按照某些特征划分成不同的层,然后从每一层中随机抽取样本。在...

    oracle 根据部门求和排序

    上面语句表示,根据col1分组,在分组内部根据col2排序,这里的“别名”的值就是每组内部排序后的序列号(组内连续的、唯一的),“[partition by col1] ”可以省略。

    Oracle基础查询关联查询练习题.docx

    Oracle 基础查询关联查询练习题中涉及到多种查询类型,包括基础查询、关联查询、分组查询等。下面我们将对每个练习题的知识点进行详细解释。 1. 基础查询 基础查询是指从数据库中检索数据的基本操作。 Oracle 基础...

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

    Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接分组字符串是一种常见的操作,用于将分组后的多条记录的某字段进行拼接。下面我们来详细介绍如何实现这种操作。 首先,创建一个测试表 `test`,该表包含三...

    Oracle常用SQL查询语句

    查询结果按表空间名称排序。 ### 3. 查询回滚段信息 ```sql SELECT segment_name, tablespace_name, r.status, (initial_extent / 1024) AS InitialExtent, (next_extent / 1024) AS NextExtent, max_extents...

    oracle之查询语句

    这个查询将按`column2`的值分组,并计算每组的行数和`column1`的总和。 Oracle还支持子查询,即嵌套在其他查询中的查询,它可以作为单个值、行集或表来使用。例如: ```sql SELECT column1 FROM table_name WHERE ...

    Oracle左连接返回多条记录中一条记录的查询语句

    Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录

    MySQL分组排序功能

    例如,在进行复杂的分组排序时,MySQL并没有提供类似于Oracle中的`OVER()`窗口函数,这使得实现某些复杂的数据分析变得较为棘手。本文将详细介绍如何在MySQL中实现类似Oracle中`row_number() over (partition by)`的...

    oracle 查询部分ppt

    其中,SELECT用于定义要查询的列,FROM指定要查询的表,WHERE用于设定查询条件,GROUP BY用于数据分组,HAVING用于分组后的过滤,ORDER BY则用于结果排序。 接着,PPT可能会详细介绍Oracle的高级查询技巧,如联接...

    Oracle多行记录合并

    它接受一个排序表达式和一个分隔符,返回所有行的合并结果。例如,假设我们有一个名为`orders`的表,其中包含`customer_id`和`order_item`字段,可以使用以下查询来合并每个客户的所有订单项: ```sql SELECT ...

    Oracle数据库基本查询知识

    本篇将深入探讨Oracle数据库的基本查询知识,帮助初学者理解如何在Oracle环境中进行数据操作。 一、SQL基础 SQL(结构化查询语言)是用于管理关系数据库的标准语言,Oracle数据库也基于此。基本的SQL语句包括SELECT...

    oracle sqlldr;;merge;分组排序;条件赋值;表连接。简单示例

    实用基础SQL语句;oracle sqlldr;SQL基础语句;merge;分组排序;条件赋值;表连接。简单示例,Oracle数据库文档数据导入

    分组排序选择需要一条

    sql 排序:row_number() over(partition by sjjl_id order by fksj desc,最优化的情况,里面放的有例子,大家可以参考

Global site tag (gtag.js) - Google Analytics