在Oracle sql中按分组类别排名

时间:2014-09-19 19:33:33

标签: sql oracle

我无法弄清楚如何按分组类别对数据进行排名。

例如,下面是来自R的mtcars数据集的代码。在oracle中,我想

按某种方式分组,说'' gear',对该组中每辆车的MPG取平均值,并显示每组的平均mpg等级

select gear, avg(MPG), rank() over (partition by gear order by avg(MPG))
FROM mtcars
group by hp

此外,如果有人能告诉我如何按多个群组或'小组进行分组。我会很感激。下面的代码

CREATE TABLE MTCARS 
("MPG" NUMBER(5,2), 
"CYL" NUMBER, 
"DISP" NUMBER(5,2), 
"HP" NUMBER, 
"DRAT" NUMBER(5,2), 
"WT" NUMBER(5,2), 
"QSEC" NUMBER(5,2), 
"VS" NUMBER, 
"AM" NUMBER, 
"GEAR" NUMBER, 
"CARB" NUMBER
) 



 INSERT INTO mtcars  VALUES ('21','6','160','110','3.9','2.62','16.46','0','1','4','4');
 INSERT INTO mtcars  VALUES ('21','6','160','110','3.9','2.875','17.02','0','1','4','4');
INSERT INTO mtcars   VALUES ('22.8','4','108','93','3.85','2.32','18.61','1','1','4','1');
 INSERT INTO mtcars   VALUES ('21.4','6','258','110','3.08','3.215','19.44','1','0','3','1');
  INSERT INTO mtcars   VALUES ('18.7','8','360','175','3.15','3.44','17.02','0','0','3','2');
  INSERT INTO mtcars   VALUES ('18.1','6','225','105','2.76','3.46','20.22','1','0','3','1');
  INSERT INTO mtcars   VALUES  ('14.3','8','360','245','3.21','3.57','15.84','0','0','3','4');
  INSERT INTO mtcars   VALUES ('24.4','4','146.7','62','3.69','3.19','20','1','0','4','2');
  INSERT INTO mtcars   VALUES ('22.8','4','140.8','95','3.92','3.15','22.9','1','0','4','2');
  INSERT INTO mtcars   VALUES ('19.2','6','167.6','123','3.92','3.44','18.3','1','0','4','4');

  INSERT INTO mtcars   VALUES ('17.8','6','167.6','123','3.92','3.44','18.9','1','0','4','4');

  INSERT INTO mtcars   VALUES ('16.4','8','275.8','180','3.07','4.07','17.4','0','0','3','3');

  INSERT INTO mtcars   VALUES ('17.3','8','275.8','180','3.07','3.73','17.6','0','0','3','3');

  INSERT INTO mtcars   VALUES ('15.2','8','275.8','180','3.07','3.78','18','0','0','3','3');

  INSERT INTO mtcars   VALUES ('10.4','8','472','205','2.93','5.25','17.98','0','0','3','4');

  INSERT INTO mtcars   VALUES ('10.4','8','460','215','3','5.424','17.82','0','0','3','4');

   INSERT INTO mtcars   VALUES ('14.7','8','440','230','3.23','5.345','17.42','0','0','3','4');

  INSERT INTO mtcars   VALUES ('32.4','4','78.7','66','4.08','2.2','19.47','1','1','4','1');

  INSERT INTO mtcars   VALUES ('30.4','4','75.7','52','4.93','1.615','18.52','1','1','4','2');

  INSERT INTO mtcars   VALUES ('33.9','4','71.1','65','4.22','1.835','19.9','1','1','4','1');

  INSERT INTO mtcars   VALUES ('21.5','4','120.1','97','3.7','2.465','20.01','1','0','3','1');

  INSERT INTO mtcars   VALUES ('15.5','8','318','150','2.76','3.52','16.87','0','0','3','2');
  INSERT INTO mtcars   VALUES ('15.2','8','304','150','3.15','3.435','17.3','0','0','3','2');
  INSERT INTO mtcars   VALUES ('13.3','8','350','245','3.73','3.84','15.41','0','0','3','4');

  INSERT INTO mtcars   VALUES ('19.2','8','400','175','3.08','3.845','17.05','0','0','3','2');

  INSERT INTO mtcars   VALUES ('27.3','4','79','66','4.08','1.935','18.9','1','1','4','1');

   INSERT INTO mtcars   VALUES ('26','4','120.3','91','4.43','2.14','16.7','0','1','5','2');

  INSERT INTO mtcars   VALUES ('30.4','4','95.1','113','3.77','1.513','16.9','1','1','5','2');
  INSERT INTO mtcars   VALUES ('15.8','8','351','264','4.22','3.17','14.5','0','1','5','4');
  INSERT INTO mtcars   VALUES ('19.7','6','145','175','3.62','2.77','15.5','0','1','5','6');
  INSERT INTO mtcars   VALUES ('15','8','301','335','3.54','3.57','14.6','0','1','5','8');
  INSERT INTO mtcars   VALUES ('21.4','4','121','109','4.11','2.78','18.6','1','1','4','2');

1 个答案:

答案 0 :(得分:0)

你可以这样做

<强> SQL Fiddle Demo

SELECT gear, 
    AVG(mpg) AS avgMpg,
    RANK() OVER(ORDER BY AVG(mpg) DESC) as Rank
FROM mtcars
GROUP BY gear