获取每个时段的条目数,不包括第一个条目(SQL查询)

时间:2014-11-14 04:55:10

标签: mysql sql

我必须进行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月份不会显示任何东西。

非常感谢你!

3 个答案:

答案 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') 

sql fiddle

答案 2 :(得分:0)

您希望每个月首先获得不同的买家,然后进行计数。这是一种便携式解决方案,更符合您在精神上处理它的方式。

从中选择x.period,count(x.buyer_id)帐户 (选择不同的DATE_FORMAT(bill_date,'%Y-%m')期间,buyer_id 来自结算)x 分组由x.period

我不喜欢列名“id”的想法,所以我在这里将它命名为“buyer_id”。请考虑更改主键的列名和我们ID。