Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多个结果的最大值(计数(*)_Sql_Oracle_Oracle Sqldeveloper_Greatest N Per Group - Fatal编程技术网

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
    子句中缺少
    C.CLIENT_NAME
    。在Oracle和大多数其他数据库中,这是一个语法错误


谢谢,效果非常好。因此,我的另一个问题是,这是否可以在没有rank函数的情况下完成?@ANDU:正如您所看到的,第一个查询没有使用
rank()