Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > сложный запросю Средние показатели


Автор: Areostar 14.1.2021, 09:50
Структура данных примерно следущая:

Код

CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `title` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
  `body` text COLLATE utf8_unicode_ci NOT NULL,
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `created_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `created_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `posts`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `users`
  ADD PRIMARY KEY (`id`);


составить запрс для получения следуюшего ответа

id пользователя 
среднее количество постов созданных за месяц и по недельно

Понимаю что тут Group By и join сочитать придётся. а как среднее за месяц и по неделям вычислять? если в базе не необределённое количество месяцев? Можно ли это сделать в рамках одного запроса?

Автор: Akina 14.1.2021, 14:27
Цитата(Areostar @  14.1.2021,  10:50 Найти цитируемый пост)
составить запрс для получения следуюшего ответа

Слишком невменяемо.

Добавь INSERT INTO с тестовыми данными (1 юзер, 10-15 записей за ~2.5 месяца) и требуемый ответ строго для э\тих данных с пояснением по каждому числу результата.

И чётко определись, какую из двух дат учитывать, а какую игнорировать.

Ну а из совсем общих соображений - просто что-нибудь типа

Код

SELECT users.name, 
       COUNT(posts.user_id) / TIMESTAMPDIFF(WEEK, MIN(posts.created_at), MAX(posts.created_at)) AVG_week, 
       COUNT(posts.user_id) / TIMESTAMPDIFF(MONTH, MIN(posts.created_at), MAX(posts.created_at)) AVG_month
FROM users
JOIN posts ON users.id = posts.user_id
GROUP BY users.name

или
Код

SELECT users.name, 
       COUNT(posts.user_id) / TIMESTAMPDIFF(DAY, MIN(posts.created_at), MAX(posts.created_at)) * 7 AVG_week, 
       COUNT(posts.user_id) / TIMESTAMPDIFF(DAY, MIN(posts.created_at), MAX(posts.created_at)) * 30 AVG_month
FROM users
JOIN posts ON users.id = posts.user_id
GROUP BY users.name


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)