繁体   English   中英

如何过滤 SQL 中值的最大出现次数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM