SQL查询重复订单日期与客户ID行并显示产品ID时遇报错求助
问题解决:筛选客户同日下单的所有记录
报错原因
你写的SQL报错是因为SELECT子句中的productid既没有被包含在GROUP BY子句中,也没有被聚合函数(比如MAX()、MIN())包裹。当你按orderdate和customerid分组后,每个分组可能对应多条不同productid的记录,数据库无法确定要返回该分组下的哪一个productid,因此触发了标准SQL的约束错误。
正确实现方案
以下是三种可行的解决方法,适用于不同的SQL场景:
方法1:窗口函数(推荐,简洁高效)
用COUNT() OVER()窗口函数标记每个orderdate+customerid组合的记录数,再筛选出记录数大于1的行:
SELECT orderdate, customerid, productid FROM ( SELECT orderdate, customerid, productid, COUNT(*) OVER(PARTITION BY orderdate, customerid) AS order_count FROM sales_orders_sheet ) AS sub_query WHERE order_count > 1;
方法2:自连接
通过自连接匹配同一客户同一日期下的不同订单记录,再去重得到目标数据:
SELECT DISTINCT s1.orderdate, s1.customerid, s1.productid FROM sales_orders_sheet s1 JOIN sales_orders_sheet s2 ON s1.orderdate = s2.orderdate AND s1.customerid = s2.customerid AND s1.productid != s2.productid;
方法3:子查询+IN条件
先通过分组找出存在重复的orderdate+customerid组合,再关联原表获取对应的productid:
SELECT orderdate, customerid, productid FROM sales_orders_sheet WHERE (orderdate, customerid) IN ( SELECT orderdate, customerid FROM sales_orders_sheet GROUP BY orderdate, customerid HAVING COUNT(*) > 1 );
内容的提问来源于stack exchange,提问作者Fin
相关产品推荐
相关产品推荐

