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

Ссылка скопирована
1 ответ

Всем привет) Сразу оговорюсь, что задача учебная, но никак не могу разобраться, как реализовать ее решение.
Есть таблица 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

Но он не выводит дни, в которых нет записей, как можно это исправить ? Спасибо !

Дополнительно:

Ответы:

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`)

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`)

  • Спасибо ! Но в Вашем решении очень много пока еще неизвестных для меня функций, я немного доработал свой изначальный код, можете, пожалуйста, подсказать, реально ли дополнив мой код сделать вывод всех дней месяца ? Или же нужно прям с нуля переписывать, как исполнили Вы. Собственно, доработанный код:
    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

  • road_warrior12,
    1. В чём смысл суммировать user_id?
    2. А если в таблицу добавить 2006 год?
  • 1) Не понимаю, как иначе добиться вывода кол-ва зарегистрированных пользователей, если использую count, то из-за группировки по датам он везде в итоге выводит единицу
    2) Поправил на WHERE register_date LIKE "%2021%06%_" . Так будет учитываться только июнь 2021
  • road_warrior12,
    1.Либо через подсчёт количества записей, которые идут раньше текущей, чем и занимается одно из WINDOW в моём запросе, либо через переменную.
    2. LIKE - медленная и не всегда индексируемая операция. Её следует по возможности избегать. В данном случае `date` BETWEEN '2021-06-01' AND '2021-06-30' будет работать лучше.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Дмитрий К. Ответ

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

1. Создайте таблицу в базе данных, в которой будет храниться информация о регистрациях пользователей. Для каждой регистрации сохраняйте дату и время регистрации.

2. Напишите SQL запрос, который выберет дату регистрации и подсчитает количество регистраций для каждого дня месяца. Для этого можно воспользоваться функцией GROUP BY, которая позволяет группировать данные по определенному столбцу (в данном случае - по дате регистрации). Пример SQL запроса:

SELECT DATE(registration_date) AS registration_day, COUNT(*) AS registrations_count
FROM registrations
GROUP BY registration_day

SELECT DATE(registration_date) AS registration_day, COUNT(*) AS registrations_count FROM registrations GROUP BY registration_day

3. Выполните этот SQL запрос на вашей базе данных. Результатом будет таблица, в которой каждая строка будет содержать день месяца и количество регистраций, произошедших в этот день.

4. Для дальнейшей обработки результатов запроса вы можете использовать язык программирования, который удобен для вас. Например, на PHP вы можете выполнить запрос к базе данных и обработать результаты, выводя их в удобном формате или сохраняя в другую структуру данных.

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно