在SQL查询中使用MAX

在SQL查询中使用MAX,sql,oracle,count,max,Sql,Oracle,Count,Max,我正在尝试获取特定商店中特定员工的最大计数。我可以很容易地得到每个员工的数量以及他们在哪个商店工作,但我只想要每个商店的前1名 SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name", Store_Num || ': ' || Store_Name AS "Store", COUNT(Emp_ID) AS "Num Rentals" FROM Employee JOIN rent

我正在尝试获取特定商店中特定员工的最大计数。我可以很容易地得到每个员工的数量以及他们在哪个商店工作,但我只想要每个商店的前1名

SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name",
        Store_Num || ': ' || Store_Name AS "Store",
        COUNT(Emp_ID) AS "Num Rentals"
FROM Employee JOIN rental USING (Emp_ID)
        JOIN store USING (Store_Num)
GROUP BY Emp_ID, First_Name, Last_Name, Store_Num, Store_Name;

Emp. Name            Store                Num Rentals
-------------------- -------------------- -----------
104: Victoria Lee    20: SQ Hill's DVD              4
102: Steve Baker     10: Oakland's DVD              3
103: Lily Evans      10: Oakland's DVD              3
105: Gloria Tremblay 20: SQ Hill's DVD              4
101: Jim Smith       10: Oakland's DVD              5
106: Emma Wesley     30: DVD Hub                    3

6 rows selected.
这将获取每个员工处理的租金数量以及他们在哪个商店工作。我只想在每家商店找到最好的员工。结果表应该是

Emp. Name            Store                Num Rentals
-------------------- -------------------- -----------
104: Victoria Lee    20: SQ Hill's DVD              4
105: Gloria Tremblay 20: SQ Hill's DVD              4
101: Jim Smith       10: Oakland's DVD              5
106: Emma Wesley     30: DVD Hub                    3

提前感谢您的帮助

您可以使用分析函数秩:

select "Emp. Name", "Store", "Num Rentals" FROM
    (SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name",
            Store_Num || ': ' || Store_Name AS "Store",
            COUNT(Emp_ID) AS "Num Rentals",
            rank() over(partition by Store_Num, Store_Name order by COUNT(Emp_ID) desc) rw
    FROM Employee JOIN rental USING (Emp_ID)
            JOIN store USING (Store_Num)
    GROUP BY Emp_ID, First_Name, Last_Name, Store_Num, Store_Name)
WHERE rw = 1;   
RANK根据ORDER BY expr(多行可以具有相同的秩)为分区BY中表示的每个组计算每行的秩


分析函数在分组后计算

您可以使用分析函数秩:

select "Emp. Name", "Store", "Num Rentals" FROM
    (SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name",
            Store_Num || ': ' || Store_Name AS "Store",
            COUNT(Emp_ID) AS "Num Rentals",
            rank() over(partition by Store_Num, Store_Name order by COUNT(Emp_ID) desc) rw
    FROM Employee JOIN rental USING (Emp_ID)
            JOIN store USING (Store_Num)
    GROUP BY Emp_ID, First_Name, Last_Name, Store_Num, Store_Name)
WHERE rw = 1;   
select t."Store", max("Emp. Name") keep (dense_rank first order by "Num Rentals" desc)
  from (SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name",
            Store_Num || ': ' || Store_Name AS "Store",
            COUNT(Emp_ID) AS "Num Rentals"
    FROM Employee JOIN rental USING (Emp_ID)
            JOIN store USING (Store_Num)
    GROUP BY Emp_ID, First_Name, Last_Name, Store_Num, Store_Name) t;
RANK根据ORDER BY expr(多行可以具有相同的秩)为分区BY中表示的每个组计算每行的秩


分析函数是在分组后由

@user2315555计算的。问题中有“前1名”,但结果表明最好使用rank。这很有效。我唯一更改的是“row_number()”改为“rank()”,因为我想得到顶级销售代表和领带。非常感谢你的帮助@user2315555问题中有“前1名”,但结果表明使用RANKT更好这很有效。我唯一更改的是“row_number()”改为“rank()”,因为我想得到顶级销售代表和领带。非常感谢你的帮助!
select t."Store", max("Emp. Name") keep (dense_rank first order by "Num Rentals" desc)
  from (SELECT Emp_ID || ': ' || First_Name || ' ' || Last_Name AS "Emp. Name",
            Store_Num || ': ' || Store_Name AS "Store",
            COUNT(Emp_ID) AS "Num Rentals"
    FROM Employee JOIN rental USING (Emp_ID)
            JOIN store USING (Store_Num)
    GROUP BY Emp_ID, First_Name, Last_Name, Store_Num, Store_Name) t;