使用oracle的MAX和rank函数

使用oracle的MAX和rank函数,oracle,max,Oracle,Max,我有三张桌子。离职测试、经理测试、销售测试 我有销售清单。一个经理可以做很多销售,但我使用sum和MAXSUM 我想从每个部门选出三名最好的max销售经理 PROMPT CREATE TABLE DEPARTS_TEST CREATE TABLE DEPARTS_TEST ( ID VARCHAR2(50) NOT NULL, NAME VARCHAR2(50) NOT NULL ) STORAGE ( NEXT 1024 K

我有三张桌子。离职测试、经理测试、销售测试 我有销售清单。一个经理可以做很多销售,但我使用sum和MAXSUM 我想从每个部门选出三名最好的max销售经理

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并将其排序为depart,但我只希望每个depart中有三个max值

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_编号而不是RANK,因为后者给出了每个部门的所有联系

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


最后,分析函数在GROUP BY之后调用,因此在OVER子句中使用order BY SUMSALLES\u test.SUM desc是合法的。

谢谢。未在预期位置找到From关键字