SQL-запрос c сортировкой по неделям
Нужно сделать выборку людей зарегистрировавшиеся за последние полгода, но при этом на выводе нужно получить количество зарегистрированных по неделям
Сейчас у нас логгируется каждая регистрация, но запрос должен композировать количество регистрациий за 1 неделю и столбцов должно получится за пол года
Как это выглядит сейчас:
01.06.22 => 'Юзер с конкретным ник-неймом',
01.06.22 => 'qwerty123',
01.06.22 => 'user123',
...
03.06.22 => 'u123456'
Вывод должен получится примерно такой:
01.06.22 => 5000,
08.06.22 => 4500,
15.06.22 => 7800,
22.06.22 => 5200,
29.06.22 => 8100,
05.07.22 => 6600
- Во втором примере каждая запись - это количество зарегистрированных пользователей за неделю
Использую DataTime
Ответы (1 шт):
Автор решения: SwaD
→ Ссылка
Тестовые данные:
-- create
CREATE TABLE EMPLOYEE (
empId INTEGER PRIMARY KEY,
name TEXT NOT NULL,
dept TEXT NOT NULL,
dd timestamp
);
-- insert
INSERT INTO EMPLOYEE VALUES (0001, 'Clark', 'Sales', DATE_SUB(CURDATE(),INTERVAL 1 DAY));
INSERT INTO EMPLOYEE VALUES (0002, 'Dave', 'Accounting', DATE_SUB(CURDATE(),INTERVAL 3 DAY));
INSERT INTO EMPLOYEE VALUES (0003, 'Ava', 'Sales', DATE_SUB(CURDATE(),INTERVAL 10 DAY));
INSERT INTO EMPLOYEE VALUES (0004, 'Clark', 'Sales', DATE_SUB(CURDATE(),INTERVAL 11 DAY));
INSERT INTO EMPLOYEE VALUES (0005, 'Dave', 'Accounting', DATE_SUB(CURDATE(),INTERVAL 13 DAY));
INSERT INTO EMPLOYEE VALUES (0006, 'Ava', 'Sales', DATE_SUB(CURDATE(),INTERVAL 17 DAY));
INSERT INTO EMPLOYEE VALUES (0007, 'Clark', 'Sales', DATE_SUB(CURDATE(),INTERVAL 17 DAY));
INSERT INTO EMPLOYEE VALUES (0008, 'Dave', 'Accounting', DATE_SUB(CURDATE(),INTERVAL 13 DAY));
INSERT INTO EMPLOYEE VALUES (0009, 'Ava', 'Sales', DATE_SUB(CURDATE(),INTERVAL 20 DAY));
Запрос, который группирует данные по неделям. Дата - понедельник.
select DATE_FORMAT(SUBDATE(dd, weekday(dd)), '%d.%m.%y'), count(*)
from EMPLOYEE
group by DATE_FORMAT(SUBDATE(dd, weekday(dd)), '%d.%m.%y');
Если надо "сдвинуть" дату начала, то запрос должен выглядеть примерно так
select DATE_FORMAT(SUBDATE(dd, weekday(dd) - 3), '%d.%m.%y'), count(*)
from EMPLOYEE
group by DATE_FORMAT(SUBDATE(dd, weekday(dd) - 3), '%d.%m.%y');