Получите накопленные данные по датам в MySQL - PullRequest
1 голос
/ 07 мая 2020

Мне нужно получить общее количество пользователей по диапазону дат, т.е. за месяц по дате. Следующий запрос работает нормально, но мне нужно запускать его для каждой даты, и я не могу использовать группировку по дате. Пожалуйста, сообщите.

  1. MySQL версия 8
  2. Пример данных
+------------------------+
| id | Registration_Date |
+------------------------+
| 1  | 2020-05-01        | 
| 2  | 2020-05-01        |
| 3  | 2020-05-02        |
| 4  | 2020-05-03        |
| 5  | 2020-05-04        |
+------------------------+
Текущий запрос
SELECT COUNT(id) AS 'Registrations'
FROM users
WHERE DATE(Registration_Date) <= "2020-05-04";
Желаемый результат
+-----------------------------------+
| Registration_Date | Registrations |
+-----------------------------------+
| 2020-05-01        | 2             |
| 2020-05-02        | 3             |
| 2020-05-03        | 4             |
| 2020-05-04        | 5             |
+-----------------------------------+

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вы можете использовать оконные функции для достижения желаемого результата, COUNT ввод id значений на текущую дату регистрации или до нее. Обратите внимание, что мы используем DISTINCT, чтобы избежать дублирования записей, когда несколько пользователей регистрируются в один и тот же день:

SELECT DISTINCT Registration_Date,
       COUNT(id) OVER (ORDER BY Registration_Date) AS Registrations
FROM users

Вывод:

Registration_Date   Registrations
2020-05-01          2
2020-05-02          3
2020-05-03          4
2020-05-04          5

Демо на dbfiddle

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

SELECT Reporting_Date,
       SUM(Registrations) OVER (ORDER BY Reporting_Date) AS Registrations
FROM (
  SELECT '2020-05-01' AS Reporting_Date, COUNT(id) AS Registrations
  FROM users
  WHERE Registration_Date <= '2020-05-01'
  UNION 
  SELECT Registration_Date, COUNT(id)
  FROM users
  WHERE Registration_Date BETWEEN '2020-05-02' AND '2020-05-04'
  GROUP BY Registration_Date
) r

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

Демо на dbfiddle

1 голос
/ 10 мая 2020

Я использовал ответ Nick в качестве источника и теперь немного изменил его, чтобы получить общий итог плюс значение ежедневного приращения.

SELECT Reporting_Date, Registrations FROM

(SELECT DISTINCT DATE(Registration_Date) AS Reporting_Date,
       COUNT(id) OVER (ORDER BY DATE(Registration_Date)) AS Registrations
FROM users) AS RAW_Result

WHERE Reporting_Date BETWEEN "2020-05-01" AND "2020-05-04";

Результат:

+-----------------------------------+
| Registration_Date | Registrations |
+-----------------------------------+
| 2020-05-01        | 1200          | (grand total until this date)
| 2020-05-02        | 1201          | (grand total + daily increment) 
| 2020-05-03        | 1202          |
| 2020-05-04        | 1203          |
+-----------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...