[英]How to filter maximum count of occurrence of a value in SQL?
我有以下查询:
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 以外的 customer_id,计数 1 的出现可能会也可能不会被忽略。 仅有的
您可以使用row_number()
window function 为每个记录分配一个编号,该编号根据每个客户的计数指定记录的顺序,然后对其进行过滤。
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_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()”聚合 function 的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.