我有一个看起来像这样的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)
任何帮助将不胜感激。
答案 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
答案 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 |
+------+-------+