MAX和rank函数使用oracle

时间:2014-11-30 17:43:01

标签: oracle max

我有三张桌子。 DEPARTS_TEST,MANAGERS_TEST,SALES_TEST 我有销售清单。一位经理可以做很多销售,但我使用sum和MAX(SUM) 我想从每个部门中选出三位最佳(最大销售额)经理。

PROMPT CREATE TABLE DEPARTS_TEST
CREATE TABLE DEPARTS_TEST (
  ID         VARCHAR2(50) NOT NULL,
  NAME          VARCHAR2(50)  NOT NULL
)
  STORAGE (
    NEXT       1024 K
  )
/

PROMPT CREATE TABLE MANAGERS_TEST
CREATE TABLE MANAGERS_TEST (
  ID         VARCHAR2(50) NOT NULL,
  NAME          VARCHAR2(100)  NOT NULL,
  DEPART VARCHAR2(100)  NOT NULL  
)
  STORAGE (
    NEXT       1024 K
  )
/

PROMPT CREATE TABLE SALES_TEST
CREATE TABLE SALES_TEST (
  ID         VARCHAR2(50) NOT NULL,
  MANAGER          VARCHAR2(100)  NOT NULL,
  SUM FLOAT(63) NOT NULL  
)
  STORAGE (
    NEXT       1024 K
  )
/

TRUNCATE TABLE DEPARTS_TEST;
PROMPT DATA DEPARTS_TEST;
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('1', 'First');
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('2', 'Second');
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('3', 'Third');
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('4', 'Fourth');
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('5', 'Fifth');
INSERT INTO DEPARTS_TEST (ID, NAME) VALUES ('6', 'Sixth');

TRUNCATE TABLE MANAGERS_TEST;
PROMPT DATA MANAGERS_TEST;
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('1', 'Oleg Kos','1');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('2', 'Kirill Nesterov','1');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('3', 'James Jeek','1');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('4', 'Patrick Komen','1');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('5', 'Samuil Marshal','1');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('6', 'Festy','2');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('7', 'Kirill Aliggat','2');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('8', 'James Dlister','2');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('9', 'Patrick Kuznetsov','2');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('10', 'Samuil Angelov,'2');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('11', 'Jekor','3');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('12', 'Kiv','3');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('13', 'Jamer','3');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('14', 'Patetsov','3');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('15', 'Saelov,'3');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('16', 'greek romer','4');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('17', 'Kirill asfixer','4');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('18', 'James Dlister','4');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('19', 'Patrick Kuznetsov','4');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('20', 'Samuil Angelov,'4');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('21', 'kopol','5');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('22', 'edurt Kirillov','5');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('23', 'ffd Dlister','5');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('24', 'FEER Kuznetsov','5');
INSERT INTO MANAGERS_TEST (ID, NAME, DEPART) VALUES ('25', 'Samuil DD','5');

TRUNCATE TABLE SALES_TEST;
PROMPT DATA SALES_TEST;
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('11', '1',16100);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('12', '1',1600);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('13', '1',16650);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('14', '2',1650);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('15', '2',1664);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('16', '3',15464);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('17', '3',1654);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('18', '3',1464);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('19', '3',1164);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('20', '4',1964);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('21', '4',1144);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('22', '5',7464);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('23', '5',1244);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('24', '5',1264);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('25', '5',14564);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('26', '6',71464);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('27', '6',13244);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('28', '6',12164);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('29', '7',14564);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('30', '7',14364);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('31', '8',11364);INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('32', '8',10364);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('33', '8',12864);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('34', '9',10864);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('36', '10',864);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('37', '11',66864);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('38', '11',6864);
INSERT INTO SALES_TEST (ID, MANAGER, SUM) VALUES ('39', '12',786864);

我写了

SELECT DEPARTS_test.NAME as depid, MANAGERS_test.NAME as man_name,SUM(SALES_test.SUM) as manager_sum,rank() 
OVER (order by SUM(SALES_test.SUM) desc) as rnk from MANAGERS_test 
INNER JOIN SALES_test on MANAGERS_test.ID=SALES_test.MANAGER 
INNER JOIN DEPARTS_test ON MANAGERS_test.DEPART=DEPARTS_test.ID
GROUP BY DEPARTS_test.NAME, MANAGERS_test.NAME
order by DEPARTS_test.NAME, manager_sum

我可以找到max并对它们进行排序,但我希望每次离开只有三个最大值

1 个答案:

答案 0 :(得分:1)

select depid, man_name, manager_sum from (
    SELECT DEPARTS_test.NAME as depid, MANAGERS_test.NAME as man_name,
           SUM(SALES_test.SUM) as manager_sum,
           ROW_NUMBER() over(partition by DEPARTS_test.NAME order by SUM(SALES_test.SUM) desc) rw
    from MANAGERS_test 
    INNER JOIN SALES_test on MANAGERS_test.ID=SALES_test.MANAGER 
    INNER JOIN DEPARTS_test ON MANAGERS_test.DEPART=DEPARTS_test.ID
    GROUP BY DEPARTS_test.NAME, MANAGERS_test.NAME
) where rw <= 3;

使用ROW_NUMBER()而不是RANK(),因为后者为每个部门提供了所有关系。

ROW_NUMBER()为组(部门)中的每一行分配一个唯一编号。

最后,在GROUP BY之后调用分析函数,因此在OVER子句中使用order by SUM(SALES_test.SUM) desc是合法的。