窗口函数COUNT() OVER (PARTITION BY)失效,SQL查询结果不符预期
问题分析与修正
你的查询核心问题出在GROUP BY子句错误包含了order_id,这会让数据按country + order_id的组合分组,完全偏离了你按国家统计的目标。
错误点拆解
GROUP BY country, order_id:这会把每个订单作为独立分组,导致COUNT(repeat_customer_id)只能统计当前单个订单内的重复客户数(通常是1或0),而非整个国家的重复客户总数。- 窗口函数
COUNT(order_id) OVER (PARTITION BY country)虽然能算出国家总订单数,但由于前面按订单分组,这个总数会在每个订单行重复显示,最终结果行数和原表订单数一致,不是你要的按国家聚合的结果。
修正后的查询
要实现按国家统计重复客户数和总订单数的目标,直接按country分组,用聚合函数统计即可:
SELECT country, COUNT(DISTINCT repeat_customer_id) AS repeat_customer, -- 用DISTINCT避免重复计数同一客户 COUNT(order_id) AS total_orders FROM table GROUP BY country
如果你的repeat_customer_id是标记字段(比如非空代表该客户是重复客户),也可以用SUM(CASE WHEN repeat_customer_id IS NOT NULL THEN 1 ELSE 0 END)来统计重复客户数量,可根据实际数据逻辑调整。
注:之前的报错是因为你最初未将order_id加入GROUP BY,但实际上你根本不需要在GROUP BY中包含order_id——你的目标是按国家聚合,订单ID是用于统计数量的聚合字段,不属于分组维度。
内容的提问来源于stack exchange,提问作者cget
相关产品推荐
相关产品推荐

