У меня есть таблица event_ с двумя столбцами (event_id и дата события)
+----------+------------+
| event_id | event_date |
+----------+------------+
| 21 | 2017-01-29 |
| 27 | 2018-01-16 |
| 45 | 2017-01-27 |
| 49 | 2018-01-29 |
| 59 | 2017-01-24 |
| 71 | 2017-01-30 |
| 73 | 2017-01-14 |
| 79 | 2017-01-16 |
| 101 | 2019-01-03 |
| 102 | 2020-01-12 |
| 119 | 2017-01-30 |
| 122 | 2019-01-18 |
| 144 | 2020-01-24 |
| 159 | 2018-01-16 |
| 164 | 2017-01-03 |
| 171 | 2018-01-17 |
| 190 | 2018-01-02 |
| 193 | 2018-01-08 |
| 200 | 2019-01-07 |
| 230 | 2017-01-23 |
| 239 | 2017-01-06 |
| 256 | 2020-01-01 |
| 277 | 2017-01-13 |
| 291 | 2018-01-17 |
| 328 | 2017-01-10 |
| 332 | 2018-01-22 |
| 341 | 2018-01-12 |
| 348 | 2019-01-17 |
| 388 | 2017-01-05 |
+----------+------------+
DDL и DML
create table event_ (event_id int , event_date date );
insert into event_ (event_id,event_date) values(21,"2017-01-29"),(27,"2018-01-16"),(45,"2017-01-27"),(49,"2018-01-29"),(59,"2017-01-24"),(71,"2017-01-30"),(73,"2017-01-14"),(79,"2017-01-16"),(101,"2019-01-03"),(102,"2020-01-12"),(119,"2017-01-30"),(122,"2019-01-18"),(144,"2020-01-24"),(159,"2018-01-16"),(164,"2017-01-03"),(171,"2018-01-17"),(190,"2018-01-02"),(193,"2018-01-08"),(200,"2019-01-07"),(230,"2017-01-23"),(239,"2017-01-06"),(256,"2020-01-01"),(277,"2017-01-13"),(291,"2018-01-17"),(328,"2017-01-10"),(332,"2018-01-22"),(341,"2018-01-12"),(348,"2019-01-17"),(388,"2017-01-05");
Я хотел бы получить помесячный анализ для каждого года с 2017 по 2020 год. В частности, для каждого месяца в эти годы я хочу определить день недели с максимальным количеством событий. Если есть несколько дней недели с одинаковым максимальным количеством событий для определенного месяца в данном году, я хотел бы определить все названия дней недели.
Ниже я упомянул ожидаемый результат:
month 2017 2018 2019 2020
1 Monday Monday,Tuesday Thursday Friday,Sunday,Wednesday
Вся помощь будет оценена по достоинству.
Привет, спасибо за ответ, это моя первая публикация, так что, возможно, я немного напутал, но на данный момент я отредактировал вопросы. Надеюсь, поможет
эй, спасибо за повтор, я сделал все возможное, отредактировал, надеюсь, это поможет, и формат даты такой, как вы упомянули.
"Я пробовал использовать функцию Windows..." Так где же этот запрос???


Нам нужно сделать это в два этапа.
Шаг 1
SELECT
YEAR(`event_date`) AS `year`,
MONTH(`event_date`) AS `month`,
WEEKDAY(`event_date`) AS `day_num`,
DAYNAME(`event_date`) AS `day_name`,
COUNT(*) AS `count`,
RANK() OVER (PARTITION BY YEAR(`event_date`), MONTH(`event_date`) ORDER BY COUNT(*) DESC) AS `rank`
FROM `event_`
GROUP BY `year`, `month`, `day_num`, `day_name`
ORDER BY `year`, `month`, `rank`;
Выход:
Шаг 2
WITH `ranked` (`year`, `month`, `day_num`, `day_name`, `rank`) AS (
SELECT
YEAR(`event_date`),
MONTH(`event_date`),
WEEKDAY(`event_date`),
DAYNAME(`event_date`),
RANK() OVER (PARTITION BY YEAR(`event_date`), MONTH(`event_date`) ORDER BY COUNT(*) DESC)
FROM `event_`
GROUP BY `year`, `month`, `day_num`, `day_name`
)
SELECT `month`,
GROUP_CONCAT(IF(`year` = 2017, `day_name`, NULL) ORDER BY `day_num`) AS `2017`,
GROUP_CONCAT(IF(`year` = 2018, `day_name`, NULL) ORDER BY `day_num`) AS `2018`,
GROUP_CONCAT(IF(`year` = 2019, `day_name`, NULL) ORDER BY `day_num`) AS `2019`,
GROUP_CONCAT(IF(`year` = 2020, `day_name`, NULL) ORDER BY `day_num`) AS `2020`
FROM `ranked`
WHERE `rank` = 1
GROUP BY `month`;
Выход:
Вот db<>рабочий пример.
Огромное спасибо... а также спасибо за редактирование таким образом, чтобы другие могли понять.
Пожалуйста! Пожалуйста, не забывайте в будущем включать всю необходимую информацию и правильно форматировать свой вопрос. Чем больше усилий вы приложите, тем больше вероятность, что вы быстро получите помощь.
🚫📸 Пожалуйста, публикуйте здесь код, ошибки, примеры данных или текстовый вывод в виде обычного текста, а не в виде изображений, которые трудно читать, которые нельзя скопировать для проверки кода или использования в ответах, и которые являются препятствием для этого. которые зависят от программ чтения с экрана или инструментов перевода. Вы можете отредактировать свой вопрос, добавив код в тело вопроса. Для удобства форматирования используйте кнопку
{}, чтобы отметить блоки кода, или сделайте отступ четырьмя пробелами для того же эффекта. Содержимое снимка экрана нельзя найти, запустить как код или легко скопировать и отредактировать для создания решения.