SQL技术问询:如何查询最高商品购买量及对应客户姓名信息
查询最高商品购买量的客户
嘿,我来帮你搞定这个SQL查询需求!首先先明确下你提到的两张表的结构(为了写SQL方便,我给它们起个好懂的名字):
purchase_data:存的是每笔订单的购买明细,字段有customer_id(客户ID)、order_id(订单ID)、purchase_quantity(这笔订单里客户买的商品数量)order_customer_map:以order_id为主键,里面有订单对应的客户ID、客户的名和姓——也就是字段包括order_id、customer_id(关联purchase_data的客户ID)、first_name、last_name
方法1:用子查询找最高购买量
这个方法适合只需要拿单一最高值的场景(如果有多个客户买得一样多且都是最高,只会返回其中一个):
SELECT CONCAT(ocm.first_name, ' ', ocm.last_name) AS customer_full_name, pd.purchase_quantity FROM purchase_data pd JOIN order_customer_map ocm ON pd.customer_id = ocm.customer_id AND pd.order_id = ocm.order_id WHERE pd.purchase_quantity = ( SELECT MAX(purchase_quantity) FROM purchase_data );
方法2:用窗口函数(强烈推荐,支持并列第一)
实际业务里经常会有多个客户购买量并列最高的情况,用窗口函数就能一次性把所有符合条件的客户都查出来,比子查询灵活多了:
WITH ranked_purchases AS ( SELECT CONCAT(ocm.first_name, ' ', ocm.last_name) AS customer_full_name, pd.purchase_quantity, RANK() OVER (ORDER BY pd.purchase_quantity DESC) AS purchase_rank FROM purchase_data pd JOIN order_customer_map ocm ON pd.customer_id = ocm.customer_id AND pd.order_id = ocm.order_id ) SELECT customer_full_name, purchase_quantity FROM ranked_purchases WHERE purchase_rank = 1;
额外提醒:如果要查客户累计总购买量
哦对了,如果你要的不是某一笔订单的最高购买量,而是某个客户所有订单加起来的总购买量的最高值,那得先按客户ID分组求和,再找最大值。给你写个窗口函数版本的:
WITH customer_total_purchases AS ( SELECT pd.customer_id, SUM(pd.purchase_quantity) AS total_quantity FROM purchase_data pd GROUP BY pd.customer_id ), ranked_customers AS ( SELECT CONCAT(ocm.first_name, ' ', ocm.last_name) AS customer_full_name, ctp.total_quantity, RANK() OVER (ORDER BY ctp.total_quantity DESC) AS total_rank FROM customer_total_purchases ctp JOIN order_customer_map ocm ON ctp.customer_id = ocm.customer_id -- 因为同一个客户可能对应多个订单,这里要去重避免重复结果 GROUP BY ctp.customer_id, ocm.first_name, ocm.last_name, ctp.total_quantity ) SELECT customer_full_name, total_quantity FROM ranked_customers WHERE total_rank = 1;
你可以根据自己的实际需求选对应的SQL就行啦!
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

