【发布时间】:2019-10-17 08:38:07
【问题描述】:
这是我的orders 表:
我想选择除每个客户的第一个订单之外的所有订单(如果客户下了多个订单)。
因此,如果客户例如215 总共有 8 个订单,那么我将选择他所有的最后 7 个订单,不包括他在 2017 年 7 月 10 日下的第一个订单 70000。
但是如果客户例如219只下过一个订单70007,必须被查询选中。
【问题讨论】:
标签: mysql
这是我的orders 表:
我想选择除每个客户的第一个订单之外的所有订单(如果客户下了多个订单)。
因此,如果客户例如215 总共有 8 个订单,那么我将选择他所有的最后 7 个订单,不包括他在 2017 年 7 月 10 日下的第一个订单 70000。
但是如果客户例如219只下过一个订单70007,必须被查询选中。
【问题讨论】:
标签: mysql
使用反连接方法:
SELECT o1.order_id, o1.customer_id, o1.order_date, o1.order_value
FROM orders o1
LEFT JOIN
(
SELECT customer_id, MIN(order_date) AS min_order_date, COUNT(*) AS cnt
FROM orders
GROUP BY customer_id
) o2
ON o1.customer_id = o2.customer_id AND
o1.order_date = o2.min_order_date
WHERE
o2.customer_site = 1 AND
(o2.customer_id IS NULL OR
o2.cnt = 1);
这里的想法是尝试将orders 中的每条记录与每个客户的子查询中的一条记录相匹配,该子查询仅包含第一笔订单记录。如果我们找不到匹配,那么这样的订单记录就不可能是第一个。
【讨论】:
customer_site 的列,它等于1 或2。我只想从customer_site = 1 获取订单。如何修改上述查询?
o1.customer_site = 1 AND (o2.bp_customer_id IS NULL OR... 并且不需要在第二张表 o2 中使用 WHERE customer_site = 1。
你可以试试下面-
select order_id,customer_id,order_date,order_Value
from tablename
group by order_id,customer_id,order_date,order_Value
having count(order_id)=1
union all
select order_id,customer_id,order_date,order_Value
from tablename a where order_date not in (select min(order_date) from tablename b
where a.customer_id=b.customer_id)
【讨论】:
解决方案
亲爱的@Tim Biegeleisen,您的回答差不多完成了。只需添加HAVING COUNT(customer_id)>1
所以查询如下:
SELECT o1.order_id, o1.customer_id, o1.order_date, o1.order_value
FROM orders o1
LEFT JOIN (
SELECT customer_id, MIN(order_date) AS min_order_date
FROM orders
GROUP BY customer_id
HAVING COUNT(customer_id)>1
) o2
ON o1.customer_id = o2.customer_id AND
o1.order_date = o2.min_order_date
WHERE
o2.customer_id IS NULL;
【讨论】: