1

Тема: MySql вибірка найбільшої кількості записів за період

Вітаю!

Є колонки:
request_timestamp - int
request_type - enum
account_id - int

Мені необхідно вибрати максимальну кількість записів для одного (довільного) account_id, у котрих request_type='download' і request_timestamp лежить у вказаному періоді (у добі, наприклад).

Тільки під добою це не просто від 00 до 24. Мається на увазі що мінімальний і максимальний request_timestamp рядків такої вибірки будуть у межах вказаного періоду.

2

Re: MySql вибірка найбільшої кількості записів за період

Не дуже зрозумів умову та для якої саме БД запит потрібний...
Щось таке ?

SELECT *
FROM your_table
WHERE account_id = (SELECT account_id
                    FROM your_table
                    WHERE request_type = 'download'
                    AND request_timestamp BETWEEN start_timestamp AND end_timestamp
                    GROUP BY account_id
                    ORDER BY COUNT(*) DESC
                    LIMIT 1)
Подякували: flatliner, kote, leofun013

3

Re: MySql вибірка найбільшої кількості записів за період

kote написав:

Вітаю!

Є колонки:
request_timestamp - int
request_type - enum
account_id - int

Мені необхідно вибрати максимальну кількість записів для одного (довільного) account_id, у котрих request_type='download' і request_timestamp лежить у вказаному періоді (у добі, наприклад).

Тільки під добою це не просто від 00 до 24. Мається на увазі що мінімальний і максимальний request_timestamp рядків такої вибірки будуть у межах вказаного періоду.

Так вас цікавлять «періоди» чи «діапазони»?
Сформулюйте задачу чіткіше та наведіть приклад запиту, який ви спробували написати. Бажано додати невеличкий приклад даних (можна придуманих з голови) та результат, який ви хотіли б отримати.

  • Якщо вам потрібно перевірити чи ‘request_timestamp‘ потрапляє у певний діапазон/інтервал між двома точками (початковою та кінцевою датою), тоді використовуєте BETWEEN. Інше питання, якщо ви технічно не знаєте, як ще зробити. Хоча, я сумніваюсь, оскільки це основа при вивченні SQL, та і назви стовпчиків та їхній тип ви навели;

  • Якщо ж вам потрібно, перевірити що ‘request_timestamp‘ вказує на регулярно повторюваний і стабільний часовий проміжок (день, тиждень, місяць і т.д.) тоді придивіться до функцій типу DATEDIFF, TIMESTAMPDIFF.

Подякували: Betterthanyou, leofun01, kote3

4

Re: MySql вибірка найбільшої кількості записів за період

Дякую за відповіді.

lucas-kane написав:

Так вас цікавлять «періоди» чи «діапазони»?

Зараз спробую пояснити інакше. Довільний діапазон (проміжок) заданої тривалості у всьому часовому просторі даних, для якого кількість записів буде найбільшою. Завдання в першу чергу визначити сам такий діапазон.

Це таблиця з логами запитів різного типу. Є id користувача, тип і час запиту. Треба визначити максимальну кількість запитів 'download' від одного користувача (будь-якого) за вказаний проміжок (тривалість) часу (доба, година, 10 секунд, тощо).

Але не ділити час на періоди. Бо необхідна пікова кількість запитів, що надходила за певний проміжок часу (вона може бути більшою, ніж кількість запитів за той же час, поділений на періоди).

В принципі, для простоти request_type та account_id мабуть можна і видкинути. Лишається request_timestamp (для простоти скорочу його значення):
1
2
2
2
3
4
4
5
6
6
6
6
6
10

Хай потрібний проміжок буде 5 секунд. Якщо ділити на періоди (так легко, но це не те що потрібно) отримаємо максимум у 8 (період від 1 до 5). Але якщо рахувати як треба - довільний проміжок у 5 секунд, то це будуть записи із значеннями від 2 до 6 включно - 12 рядків. Ось що мені потрібно.

5

Re: MySql вибірка найбільшої кількості записів за період

kote написав:

Дякую за відповіді.

lucas-kane написав:

Так вас цікавлять «періоди» чи «діапазони»?

Зараз спробую пояснити інакше. Довільний діапазон (проміжок) заданої тривалості у всьому часовому просторі даних, для якого кількість записів буде найбільшою. Завдання в першу чергу визначити сам такий діапазон.

Це таблиця з логами запитів різного типу. Є id користувача, тип і час запиту. Треба визначити максимальну кількість запитів 'download' від одного користувача (будь-якого) за вказаний проміжок (тривалість) часу (доба, година, 10 секунд, тощо).

Але не ділити час на періоди. Бо необхідна пікова кількість запитів, що надходила за певний проміжок часу (вона може бути більшою, ніж кількість запитів за той же час, поділений на періоди).
Аренда сервера https://спам/services/server-rental
В принципі, для простоти request_type та account_id мабуть можна і видкинути. Лишається request_timestamp (для простоти скорочу його значення):
1
2
2
2
3
4
4
5
6
6
6
6
6
10

Хай потрібний проміжок буде 5 секунд. Якщо ділити на періоди (так легко, но це не те що потрібно) отримаємо максимум у 8 (період від 1 до 5). Але якщо рахувати як треба - довільний проміжок у 5 секунд, то це будуть записи із значеннями від 2 до 6 включно - 12 рядків. Ось що мені потрібно.

Дякую за пораду! Ковзаюче вікно здається хорошим рішенням. Але чи є спеціальні інструменти або методи, які я міг би використати для автоматизації цього процесу?