如何筛选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()”聚合函数的方法。这正是答案所在