MySQL选择每年只计算新的id

问题描述 投票:0回答:3

我有一个看起来像这样的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) 

任何帮助,将不胜感激..

mysql select count distinct having
3个回答
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
投票

因此,您希望计算客户端在表格中显示的第一个日期。换句话说,没有其他行存在的行具有较早的日期和相同的客户端。您可以使用排除连接执行此操作。

然后你可以像现在一样每年计算它们。

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格式存储为字符串,则无法进行>比较。


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 |
+------+-------+
© www.soinside.com 2019 - 2024. All rights reserved.