首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择每年只计算新的id

MySQL选择每年只计算新的id
EN

Stack Overflow用户
提问于 2019-02-27 16:33:05
回答 3查看 137关注 0票数 0

我有一个像这样的MySQL表

代码语言:javascript
复制
    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人。

代码语言:javascript
复制
 SELECT COUNT(DISTINCT client_id) FROM table GROUP BY YEAR(date) 

任何帮助都将不胜感激..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-27 16:40:58

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

代码语言:javascript
复制
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在这里

票数 3
EN

Stack Overflow用户

发布于 2019-02-27 16:39:12

因此,您希望计算客户端出现在表中的第一次约会。换句话说,没有其他行存在的行具有较早的日期和相同的客户端。您可以使用排除连接来完成此操作。

然后你就可以像现在这样每年数一数。

代码语言:javascript
复制
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

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

票数 1
EN

Stack Overflow用户

发布于 2019-02-27 16:47:06

代码语言:javascript
复制
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 |
+------+-------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54910184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档