MySQL Select每年仅计算新ID

时间:2019-02-27 16:33:06

标签: mysql select count distinct having

我有一个看起来像这样的MySQL表

    id   |   client_id   |    date
  --------------------------------------
     1   |       12      | 02/02/2008
     2   |       15      | 12/06/2008
     3   |       23      | 11/12/2008
     4   |       12      | 18/01/2009
     5   |       12      | 03/03/2009
     6   |       18      | 02/07/2009
     7   |       23      | 08/09/2010
     8   |       18      | 02/10/2010
     9   |       21      | 30/11/2010

我想做的是获取每年的新客户数量。 2008年有3个新客户(12,15,23),2009年有1个新客户(18),2010年有1个新客户(21)。

到目前为止,我有此查询可为我提供每年的不同客户,即2008年为3个,2009年为2个,2010年为3个。

 SELECT COUNT(DISTINCT client_id) FROM table GROUP BY YEAR(date) 

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以使用子查询来获取按client_id分组的每个client_id的第一年,然后计算按年份分组的client_id的出现,因此:

SELECT COUNT(client_id), YEAR_MIN FROM (
    SELECT client_id, MIN(YEAR(date)) AS YEAR_MIN 
    FROM   table 
    GROUP BY client_id) AS T
GROUP BY YEAR_MIN

SQL Fiddle here

答案 1 :(得分:1)

因此,您要计算客户第一次出现在表格中的日期。换句话说,没有其他行的日期早于同一客户的行。您可以通过排除联接来实现。

然后,您可以像现在这样每年对它们进行计数。

SELECT YEAR(t.date) AS yr, COUNT(t.client_id) AS client_count
FROM (
  SELECT t1.client_id, t1.date
  FROM mytable AS t1
  LEFT JOIN mytable AS t2 ON (t1.client_id=t2.client_id AND t1.date > t2.date)
  WHERE t2.client_id IS NULL) AS t
GROUP BY yr

您应使用DATE数据类型存储日期,该数据类型使用YYYY-MM-DD格式。如果您的日期以DD-MM-YYYY格式存储为字符串,则将无法进行>比较。

答案 2 :(得分:1)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,client_id INT NOT NULL
,date INT NOT NULL
);

INSERT INTO my_table VALUES
(1,12,2008),
(2,15,2008),
(3,23,2008),
(4,12,2009),
(5,12,2009),
(6,18,2009),
(7,23,2010),
(8,18,2010),
(9,21,2010);

SELECT year
     , COUNT(*) total 
  FROM 
     ( SELECT client_id, MIN(date) year FROM my_table GROUP BY client_id ) x 
 GROUP 
    BY year;
+------+-------+
| year | total |
+------+-------+
| 2008 |     3 |
| 2009 |     1 |
| 2010 |     1 |
+------+-------+