MySQL select 仅计算每年的新 ID
MySQL select count only new id's for each year
我有一个 MySQL table 看起来像这样
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)
任何帮助将不胜感激..
因此您要计算客户出现在 table 中的第一个日期。换句话说,没有其他行的行具有更早的日期和相同的客户。您可以使用 exclusion join.
执行此操作
然后你可以像现在一样每年计算它们。
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 格式存储为字符串,您将无法进行 >
比较。
您可以使用子查询获取按 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
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 |
+------+-------+
我有一个 MySQL table 看起来像这样
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)
任何帮助将不胜感激..
因此您要计算客户出现在 table 中的第一个日期。换句话说,没有其他行的行具有更早的日期和相同的客户。您可以使用 exclusion join.
执行此操作然后你可以像现在一样每年计算它们。
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 格式存储为字符串,您将无法进行 >
比较。
您可以使用子查询获取按 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
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 |
+------+-------+