Как я могу определить для каждого года с 2017 по 2020 год, в какой день недели проводилось максимальное количество мероприятий в месяц?

У меня есть таблица 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

Вся помощь будет оценена по достоинству.

🚫📸 Пожалуйста, публикуйте здесь код, ошибки, примеры данных или текстовый вывод в виде обычного текста, а не в виде изображений, которые трудно читать, которые нельзя скопировать для проверки кода или использования в ответах, и которые являются препятствием для этого. которые зависят от программ чтения с экрана или инструментов перевода. Вы можете отредактировать свой вопрос, добавив код в тело вопроса. Для удобства форматирования используйте кнопку {}, чтобы отметить блоки кода, или сделайте отступ четырьмя пробелами для того же эффекта. Содержимое снимка экрана нельзя найти, запустить как код или легко скопировать и отредактировать для создания решения.

tadman 14.09.2023 20:54

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

K_9291 14.09.2023 21:37

эй, спасибо за повтор, я сделал все возможное, отредактировал, надеюсь, это поможет, и формат даты такой, как вы упомянули.

K_9291 14.09.2023 21:55

"Я пробовал использовать функцию Windows..." Так где же этот запрос???

Eric 14.09.2023 22:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нам нужно сделать это в два этапа.

  1. ГРУППИРУЙТЕ ПО ГОДУ, МЕСЯЦУ, ДНЮ НЕДЕЛИ и добавьте РАНГ().
  2. Выберите дни, занимающие первое место в месяце и разворот в году.

Шаг 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`;

Выход:

год месяц день_номер день_название считать классифицировать 2017 год 1 0 Понедельник 4 1 2017 год 1 4 Пятница 3 2 2017 год 1 1 Вторник 3 2 2017 год 1 6 Воскресенье 1 4 2017 год 1 5 Суббота 1 4 2017 год 1 3 Четверг 1 4 2018 год 1 1 Вторник 3 1 2018 год 1 0 Понедельник 3 1 2018 год 1 2 Среда 2 3 2018 год 1 4 Пятница 1 4 2019 год 1 3 Четверг 2 1 2019 год 1 4 Пятница 1 2 2019 год 1 0 Понедельник 1 2 2020 год 1 6 Воскресенье 1 1 2020 год 1 4 Пятница 1 1 2020 год 1 2 Среда 1 1

Шаг 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`;

Выход:

месяц 2017 год 2018 год 2019 год 2020 год 1 Понедельник Понедельник вторник Четверг Среда, Пятница, Воскресенье

Вот db<>рабочий пример.

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

K_9291 15.09.2023 07:47

Пожалуйста! Пожалуйста, не забывайте в будущем включать всю необходимую информацию и правильно форматировать свой вопрос. Чем больше усилий вы приложите, тем больше вероятность, что вы быстро получите помощь.

user1191247 15.09.2023 08:50

Другие вопросы по теме