@road_warrior12

Как посчитать количество регистраций по каждому дню месяца?

Всем привет) Сразу оговорюсь, что задача учебная, но никак не могу разобраться, как реализовать ее решение.
Есть таблица registers, в которой есть поля user_id и register_date( формат date)
Выглядит она вот так:
user_id register_date
001 2021-02-01
002 2021-02-15
003 2021-02-15
004 2021-04-12
005 2021-06-01
006 2021-06-02
007 2021-06-15

Суть задачи в следующем - вывести количество пользователей, которые были уже зарегестрированы к моменту июня 2021. Вывод должен быть таким:
report_date cnt_all_couriers
2021-06-01 5
2021-06-02 6
2021-06-03 6
2021-06-04 6
---
2021-06-15 7

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

написал следующий код:
CREATE TABLE registers (
user_id int,
register_date date
);

INSERT INTO registers VALUES
(001, '2021-02-01'), (002, '2021-02-15'), (003, '2021-02-15'), (004, '2021-06-01'), (005, '2021-06-02'), (006, '2021-06-03'), (007, '2021-06-15');

SELECT register_date, sum(user_id) AS cnt_all_users
FROM registers
WHERE register_date LIKE "_%06%_"
GROUP BY register_date

Но он не выводит дни, в которых нет записей, как можно это исправить ? Спасибо !
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
user_id соответсвует количеству зарегистрированных клиентов и написал следующий код
Неудачное решение. Нет никаких гарантий, что id будут идти строго последовательно.

Решение для MySQL 8.0 и выше
WITH RECURSIVE `dates` (`date`) AS (
  SELECT '2021-06-01'
  UNION
  SELECT `date` + INTERVAL 1 DAY
    FROM `dates`
    WHERE `date` < '2021-06-30'
)
SELECT `d`.`date`, MAX(`c`.`count`) OVER `win` AS `registered`
  FROM `dates` AS `d`
  LEFT JOIN (
    SELECT DISTINCT `date`, COUNT(*) OVER `win` AS `count`
      FROM `registers`
      WINDOW `win` AS (ORDER BY `date`)
  ) AS `c` ON `c`.`date` = `d`.`date`
  WINDOW `win` AS (ORDER BY `d`.`date`)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы