我必须进行SQL查询,这会给我每个月的买家数量,这个月至少进行了一次购买,而不是计算这个买家的第一次购买。
例如,我有这张表:
id bill_date
1 2014-01-14
1 2014-02-14
2 2014-02-14
2 2014-02-18
1 2014-02-19
2 2014-03-14
1 2014-03-14
1 2014-03-16
1 2014-04-08
1 2014-06-03
2 2014-06-10
1 2014-06-11
3 2014-11-07
3 2014-11-13
因此:
Jan - 1 bill for ID1
Feb - 2 bills for ID2, 2 bills for ID1
Mar - 1 bill for ID1, 2 bills for ID2
Apr - 1 bill for ID1
Jun - 2 bills for ID1, 1 bill for ID2
Nov - 2 bills for ID3
预期结果:
period accounts
2014-02 2
2014-03 2
2014-04 1
2014-06 2
2014-11 1
基本上,由于ID1在1月份进行了购买,因此在1月份之后的每个月都会进行一次明显的计数。
由于ID2在2月份进行了两次购买,因此2月份会有1次购买,之后每个月会有1次购买(即使他们多次购买)。
对于ID3,他们在11月份进行了两次购买,因此将其视为11月的1。如果他们在11月份进行了一次购买,而在12月进行了另一次购买,那么12月份会有一次购买,但11月份不会显示任何东西。
非常感谢你!
答案 0 :(得分:0)
您首先需要使用LEFT才能按前7个字符(年份和日期)进行分组。然后,获取该月份不同帐户的计数。最后也是最重要的是,要仅计算前几个月购买的ID,您必须重新加入该表,并且只计算t1中t2中相同帐户的早期行的行。
SELECT LEFT(t1.bill_date, 7) AS period, COUNT(DISTINCT t1.id) AS accounts
FROM tableName t1
JOIN tableName t2 ON t1.id = t2.id
AND t2.bill_date < t1.bill_date
GROUP BY period
ORDER BY period
小提琴:
http://sqlfiddle.com/#!2/184c8/6
(编辑:我删除了&#34; HAVING帐户&gt; 0&#34;条款。这是不必要的。)
答案 1 :(得分:0)
这可能会对您有所帮助:
SELECT date_format(t1.bill_date, '%Y-%m') AS dt,
Count(DISTINCT t1.id) AS cnt
FROM tempt t1
JOIN (SELECT id,
Min(bill_date) AS bill_date
FROM tempt
GROUP BY id) AS t2
ON t1.id = t2.id
AND t1.bill_date <> t2.bill_date
GROUP BY date_format(t1.bill_date, '%Y-%m')
答案 2 :(得分:0)
您希望每个月首先获得不同的买家,然后进行计数。这是一种便携式解决方案,更符合您在精神上处理它的方式。
从中选择x.period,count(x.buyer_id)帐户 (选择不同的DATE_FORMAT(bill_date,'%Y-%m')期间,buyer_id 来自结算)x 分组由x.period
我不喜欢列名“id”的想法,所以我在这里将它命名为“buyer_id”。请考虑更改主键的列名和我们ID。