Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 - Fatal编程技术网

如何筛选SQL中出现值的最大计数?

如何筛选SQL中出现值的最大计数?,sql,oracle,Sql,Oracle,我有以下疑问: SELECT customer_id, product_id, COUNT(product_id) CUSTOMER_PRODUCT_COUNT FROM Order_Details Group BY customer_id, product_id ORDER BY customer_id; 其结果如下表所示: CUSTOMER_I PRODUCT_ID CUSTOMER_PRODUCT_COUNT ---------- ---------- -------------

我有以下疑问:

SELECT customer_id, product_id, COUNT(product_id) CUSTOMER_PRODUCT_COUNT
FROM Order_Details
Group BY customer_id, product_id
ORDER BY customer_id;
其结果如下表所示:

    CUSTOMER_I PRODUCT_ID CUSTOMER_PRODUCT_COUNT
---------- ---------- ----------------------
C1         P3                              2
C1         P4                              1
C2         P5                              1
C3         P2                              4
C3         P3                              1
C3         P4                              1
C4         P1                              3
C4         P6                              1
C5         P6                              1

9 rows selected.
我在筛选出每个客户的产品id的最大出现次数时遇到问题

CUSTOMER_ID PRODUCT_ID CUSTOMER_PRODUCT_COUNT
---------- ---------- ----------------------
C1         P3                              2
C2         P5                              1
C3         P2                              4
C4         P1                              3
C5         P6                              1

对于除C1和C3之外的客户id,计数1的出现可以省略,也可以不省略。只有您可以使用
行编号()
窗口功能为每个记录分配一个编号,该编号根据每个客户的计数指定记录的顺序,然后根据该编号进行过滤

SELECT customer_id,
       product_id,
       customer_product_count
       FROM (SELECT customer_id,
                    product_id,
                    count(product_id) customer_product_count,
                    row_number() OVER (PARTITION BY customer_id
                                       ORDER BY count(product_id) DESC) r
                    FROM order_details
                    GROUP BY customer_id,
                             product_id
                    ORDER BY customer_id) x
       WHERE r = 1;

如果要包括关系,请使用
rank()
而不是
row\u number()

Oracle中的另一种方法是两级聚合:

SELECT customer_id, CUSTOMER_PRODUCT_COUNT,
       MAX(product_id) KEEP (DENSE_RANK FIRST ORDER BY CUSTOMER_PRODUCT_COUNT DESC) as product_id
FROM (SELECT customer_id, product_id, COUNT(*) AS CUSTOMER_PRODUCT_COUNT
      FROM Order_Details
      GROUP BY customer_id, product_id
     ) cp
GROUP BY customer_id
ORDER BY customer_id;

KEEP
表达式是Oracle定义“first()”聚合函数的方法。

这正是答案所在