按计划在一段时间内按客户ID分组

时间:2017-11-22 12:54:28

标签: mysql group-by

我试图仅选择在特定时间段内每年至少订购一次的客户ID,例如2010年至2017年

例子:
1. 2010年,2011年,2012年,2013年,2014年,2015年,2016年,2017年订购的客户应显示为 2.客户在2010年,2011年,2012,2013,2014,2015,2017年订购时不应显示

我的查询在所有年份内都不计入

o_id    o_c_id  o_type      o_date
1345    13    TA          2015-01-01
7499    13    TA          2015-01-16
7521    14    GA          2015-01-08
7566    14    TA          2016-01-24
7654    16    FB          2016-01-28

c_id    c_name  c_email
13      Anderson  example@gmail.com          
14      Pegasus   example@gmail.com
15      Miguel    example@gmail.com
16      Megan     example@gmail.com

我的疑问:

select c.id, c.name, count(*) as counts, year(o.date)
from orders o
join customer c on o.c_id=c.id
where year(o.date) > 2009
group oy c.id
having count(*) > 7

1 个答案:

答案 0 :(得分:0)

您需要一张包含所有年份的表格,以便您可以检查该年度的用户订单。我创建了一个只有两年的样本,因为这是样本数据中的内容。

您可以使用它来创建年份列表:

How to get list of dates between two dates in mysql select query

此外,我使用范围多年,因此您可以在加入时使用索引。

如果您已有表users,则可以替换子查询

SQL DEMO

SELECT user_id, COUNT(o_id) as total_years
FROM years y
CROSS JOIN (SELECT DISTINCT `o_c_id` as `user_id` FROM `orders`) as users
LEFT JOIN orders o
  ON o.`o_date` >= y.`year_begin`
 AND o.`o_date` < y.`year_end`
 AND o.`o_c_id` = `user_id`
GROUP BY user_id
HAVING total_years = (SELECT COUNT(*) FROM years)
 ;
相关问题