MySQL select рассчитывать только новые идентификаторы для каждого года - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть таблица 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).

Пока у меня есть этот запрос, который дает мне отдельных клиентов длякаждый год, то есть 3 за 2008 год, 2 за 2009 год и 3 за 2010 год.

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

Буду признателен за любую помощь.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы можете использовать подзапрос, чтобы получить первый год каждого 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 здесь

0 голосов
/ 27 февраля 2019
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 |
+------+-------+
0 голосов
/ 27 февраля 2019

Итак, вы хотите сосчитать первую дату, когда клиент появится в таблице.Другими словами, строка, для которой не существует другой строки с более ранней датой и тем же клиентом.Вы можете сделать это с помощью исключающего соединения .

Тогда вы можете считать их за год, как вы делаете сейчас.

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, который использует формат ГГГГ-ММ-ДД.Вы не сможете делать > сравнения, если ваши даты хранятся в виде строк в формате DD-MM-YYYY.

...