powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Один запрос на выборку данных из нескольких диапазонов
6 сообщений из 6, страница 1 из 1
Один запрос на выборку данных из нескольких диапазонов
    #40128178
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.

Есть таблица продаж, упрощенно: user_id, datetime, volume.

Нужно из нее выбрать суммы продаж по юзерам из списка (обычная строка с индексами юзеров через запятую) в трех разных диапазонах дат: date1_begin - date1_end, date2_begin - date2_end, date3_begin - date3_end.
Эти диапазоны следуют друг за другом без разрывов.
Т.е., предположим, по месяцам - январь, февраль, март.

Последнего диапазона может не быть - т.е., выборка только за январь и февраль.

Сейчас это делаю тремя запросами - по первому диапазону, по второму и, если задано, по третьему.

Вероятно существует способ сделать это одним запросом? Подскажите, пожалуйста, как.
Спасибо!
...
Рейтинг: 0 / 0
Один запрос на выборку данных из нескольких диапазонов
    #40128206
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передавать диапазоны как набор записей, и использовать в выражении группировки и условиях отбора.
...
Рейтинг: 0 / 0
Один запрос на выборку данных из нескольких диапазонов
    #40128229
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильно ли я Вас понял, что следует использовать запрос типа:

Код: sql
1.
2.
3.
4.
5.
select
sum(if(datetime < "2022-01-01", volume, 0)) as "dec",
sum(if(datetime >= "2022-01-01", volume, 0)) as "jan"
from orders
where (datetime >= "2021-12-01") and (user_id in (1,2,3,4,5))



У меня вначале была такая мысль, но я посчитал, что такой запрос будет отработан медленнее, чем два прямых:

Код: sql
1.
2.
3.
4.
5.
select sum(volume) as "dec" from orders
where (datetime >= "2021-12-01") and (datetime < "2022-01-01") and (user_id in (1,2,3,4,5))

select sum(volume) as "jan" from orders
where (datetime >= "2022-01-01") and (datetime < "2022-02-01") and (user_id in (1,2,3,4,5))



Я ошибаюсь?
Пока данных в базе мало и я не могу протестировать на скорость разные варианты.
...
Рейтинг: 0 / 0
Один запрос на выборку данных из нескольких диапазонов
    #40128242
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
...
FROM sales
JOIN ( SELECT DATE '2021-01-01' start, DATE '2021-01-31' finish
       UNION ALL
       SELECT '2021-02-01', '2021-02-28'
       UNION ALL
       SELECT '2021-03-01', '2021-03-31' ) ranges ON sales.sale_date BETWEEN ranges.start AND ranges.finish
...
...
Рейтинг: 0 / 0
Один запрос на выборку данных из нескольких диапазонов
    #40128276
OlegROA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, понятно.

Благодаря Вашей наводке я объединил свои запросы в один через UNION ALL.
Проверил на тестовой таблице - мой новый вариант и Ваш оказались практически одинаковы по скорости - разница на уровне статистической погрешности (меньше одного процента).
А вот вариант, от которого я отказался, посчитав его медленным, действительно таковым и оказался - медленнее более чем на 25%!

В общем, спасибо за совет!
...
Рейтинг: 0 / 0
Один запрос на выборку данных из нескольких диапазонов
    #40128300
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlegROA , попробуйте в два запроса. Первым - создать темп-таблицу (engine=memory) с индексами (start,finish) и (finish,start), и слить в неё диапазоны, а во втором использовать её. При трёх записях, наверное, улучшения не будет, а вот если потребуется помесячно, скажем, за год - тут должен быть профит.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Один запрос на выборку данных из нескольких диапазонов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]