SQL-запрос c сортировкой по неделям

Рейтинг: 0Ответов: 1Опубликовано: 12.01.2023

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

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

Ответы

▲ 0Принят

Тестовые данные:

-- 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');