Oracle 表的分组操作

需求:

1.查出每组的前几条数据;

2.查出每组数据条数满足一定数目的数据;

数据库建表以及插入数据sql如下

CREATE TABLE request (
  buyer_company_name varchar(100),
  buyer_com_id int,
  buyer_com_country varchar(200),
  subject varchar(200)
);
INSERT INTO request VALUES (‘Media101‘, 1001, ‘Australia‘, ‘Australia_1‘);
INSERT INTO request VALUES (‘Media101‘, 1001, ‘Australia‘, ‘Australia_2‘);
INSERT INTO request VALUES (‘Media101‘, 1001, ‘Australia‘, ‘Australia_3‘);
INSERT INTO request VALUES (‘Media102‘, 1002, ‘Australia‘, ‘Australia_1‘);
INSERT INTO request VALUES (‘Media102‘, 1002, ‘Australia‘, ‘Australia_2‘);
INSERT INTO request VALUES (‘Media102‘, 1002, ‘Australia‘, ‘Australia_3‘);
INSERT INTO request VALUES (‘Media103‘, 1003, ‘Australia‘, ‘Australia_1‘);
INSERT INTO request VALUES (‘Media104‘, 1004, ‘Australia‘, ‘Australia_1‘);
INSERT INTO request VALUES (‘Media105‘, 1005, ‘Australia‘, ‘Australia_1‘);
INSERT INTO request VALUES (‘ali101‘, 1006, ‘India‘, ‘India_1‘);
INSERT INTO request VALUES (‘ali102‘, 1007, ‘India‘, ‘India_1‘);
INSERT INTO request VALUES (‘ali103‘, 1008, ‘India‘, ‘India_1‘);
INSERT INTO request VALUES (‘ali103‘, 1008, ‘India‘, ‘India_2‘);
INSERT INTO request VALUES (‘ali103‘, 1008, ‘India‘, ‘India_3‘);
INSERT INTO request VALUES (‘ali103‘, 1008, ‘India‘, ‘India_4‘);
INSERT INTO request VALUES (‘ali104‘, 1009, ‘India‘, ‘India_1‘);

具体:

1. 查询出每个国家的2个公司

一开始会这么写,这是有问题的,查询出的结果会少于2个,即使加了distinct去重。不知道为什么,忘知情者留言

select *
  from request a
 where buyer_com_id in (select distinct buyer_com_id
                          from request b
                         where b.buyer_com_country = a.buyer_com_country
                           and rownum <= 2)

结果:

正确的写法如下:

select *
  from request a
 where buyer_com_id in
       (select buyer_com_id
          from (select distinct buyer_com_id, buyer_com_country from request) b
         where b.buyer_com_country = a.buyer_com_country
           and rownum <= 2)

2.查询出每个国家的发布信息条数在2条以上的2个公司

有了以上的基础,这个sql就很好写了

select *
  from request a
 where buyer_com_id in (select buyer_com_id
                          from (select buyer_com_id, buyer_com_country
                                  from request
                                having count(*) > 2
                                 group by buyer_com_country, buyer_com_id) b
                         where b.buyer_com_country = a.buyer_com_country
                           and rownum <= 2)

2.1 如果有个要求竟敢是: 查询出每个国家的2个公司,再找出发布信息条数在2条以上的

那只能拿出这个丑陋的sql来了

select *
  from request
 where buyer_com_id in
       (select buyer_com_id
          from request a
         where buyer_com_id in
               (select buyer_com_id
                  from (select distinct buyer_com_id, buyer_com_country
                          from request) b
                 where b.buyer_com_country = a.buyer_com_country
                   and rownum <= 2) having count(*) > 2
         group by buyer_com_id)

结果为:

如果你有更简洁的 或者不同的sql,可以实现相同的效果,欢迎留言

时间: 2024-08-26 12:35:24

Oracle 表的分组操作的相关文章

oracle表的修改操作

增加字段语法:alter table tablename add (column datatype [default value][null/not null],….); 说明:alter table 表名 add (字段名 字段类型 默认值 是否为空); 例:alter table sf_users add (HeadPIC blob); 例:alter table sf_users add (userName varchar2(30) default '空' not null); 修改字段的

Oracle表空间和表的入门操作指令

Oracle数据库-常用操作指令 查看端口号指令 netstat –a 清屏: SQL> clear scre; SQL> host cls; 表空间   建立表空间 SQL> create tablespace tc20 datafile 'e:\tc20_data_dbf' size 20m autoextend on next 5m maxsize 500m; 查询表空间名称 SQL> select tablespace_name,file_name from dba_dat

Oracle表的操作

--创建表 CREATE [GLOBAL TEMPORARY] TABLE table_name( coloum_name TYPE [CONSTRAINT constraint_def DEFAULT default_exp] [,coloum_name TYPE [CONSTRAINT constraint_def DEFAULT default_exp] ...] ) [ON COMMIT {DELETE | PRESERVE} ROWS] TABLESPACE tab_space; /*

ORACLE表空间操作实例

本文主要介绍oracle表空间常见的操作实例,包括创建.查询.增加.删除.修改.表空间和数据文件常用的数据字典和动态性能视图包括v$dbfile.v$datafile.dba_segments.user_segments.dba_data_files.v$tablespace.dba_tablespaces.user_tablespaces. 创建表空间 1.创建数据表空间 CREATE TABLESPACE test DATAFILE '/opt/oracle/oradata/test.dbf

Oracle中如何实现Mysql的两表关联update操作

在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.price WHERE items.id=month.id; 在MySQL中构造表验证了一下 mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 100 | | 2 | 200 | | 3

ORACLE表test01字段的操作

SQL> create table test01     (NO NUMBER NOT NULL,NAME VARCHAR(30)); 1.修改表名称      SQL> alter table test01 rename to test02; Table altered. SQL> desc test01 ERROR: ORA-04043: object test01 does not exist SQL> desc test02  Name                   

oracle解决多表关联分组查询问题

做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid,(select vindexcode from comindex where pk_index =cindexid) as vindexcode ,iquesttype from rqt_examquest where pk_examquest in (    select cexamquesti

oracle 表误更新 (flashback )闪回操作

--oracle  表误更新  闪回操作 测试环境 --select * from v$database; --select * from v$version; 操作第一步 1.如下命令启用行迁移 alter table test_a enable row movement; 2.如下命令闪回到某时间点 flashback table test_a to timestamp to_timestamp('2012-05-31 16:20:30', 'yyyy-mm-dd hh24:mi:ss');

oracle——数据表的相关操作——删除数据表

创建数据表; create table 表名 ( 列明1 数据类型1 [约束性条件], 列明1 数据类型1 [约束性条件], …… ) tablespace 表空间 create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test sele