Sql 多个结果的最大值(计数(*)
我有两张桌子:Sql 多个结果的最大值(计数(*),sql,oracle,oracle-sqldeveloper,greatest-n-per-group,Sql,Oracle,Oracle Sqldeveloper,Greatest N Per Group,我有两张桌子: Clients(client_id(pk),client_name,phone,email) orders(order_number(pk),date,client_id,method) 我只想选择订单最多的客户的详细信息(例如:如果最高订单数为6,并且有3个客户的订单数,我希望显示所有3个客户)。我的问题是,我只能显示一个客户端的详细信息,我希望看到所有最大值的详细信息 这就是我迄今为止所尝试的: SELECT MAX(NUMBER_OF_ORDERS) FROM (
Clients(client_id(pk),client_name,phone,email)
orders(order_number(pk),date,client_id,method)
我只想选择订单最多的客户的详细信息(例如:如果最高订单数为6,并且有3个客户的订单数,我希望显示所有3个客户)。我的问题是,我只能显示一个客户端的详细信息,我希望看到所有最大值的详细信息
这就是我迄今为止所尝试的:
SELECT MAX(NUMBER_OF_ORDERS)
FROM (
SELECT C.CLIENT_NAME,
COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS
FROM CLIENTS C,
ORDERS O
WHERE C.ID_CLIENT = O.ID_CLIENT
GROUP BY C.NUME_CLIENT
);
我只想选择订单最多的客户的详细信息
从Oracle 12开始,使用row limit子句很容易:
SELECT C.CLIENT_NAME, COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS
FROM CLIENTS C
INNER JOIN ORDERS O ON C.ID_CLIENT = O.ID_CLIENT
GROUP BY C.NUME_CLIENT, C.CLIENT_NAME
ORDER BY NUMBER_OF_ORDERS DESC
FETCH FIRST 1 ROW WITH TIES
在早期版本中,一个选项是使用窗口功能:
SELECT CLIENT_NAME, NUMBER_OF_ORDERS
FROM (
SELECT
C.CLIENT_NAME,
COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS,
RANK() OVER(ORDER BY COUNT(O.CLIENT_ID) DESC) RN
FROM CLIENTS C
INNER JOIN ORDERS O ON C.ID_CLIENT = O.ID_CLIENT
GROUP BY C.NUME_CLIENT, C.CLIENT_NAME
) T
WHERE RN = 1
重要提示:
- 始终使用显式的标准连接(使用
关键字),而不是老式的隐式连接(在ON
子句中使用逗号),其语法几十年来一直不受欢迎FROM
- 出现在
子句中的所有非聚合列必须在SELECT
子句中列出;原始查询在GROUP BY
子句中缺少GROUP BY
。在Oracle和大多数其他数据库中,这是一个语法错误C.CLIENT_NAME
rank()
。