powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с условием
9 сообщений из 9, страница 1 из 1
Группировка с условием
    #39572564
checkdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Пишу SQL запрос, но не могу понять как реализовать. Есть некая база, в которой записаны ip, время и количество скачанной информации, выглядит примерно так:

автор217.182.132.29 17:12:34 22372
217.182.132.29 17:13:34 22372
217.182.132.29 17:17:34 22372
217.182.132.29 18:12:34 22372
217.182.132.29 18:15:34 22372
217.182.132.29 18:17:34 22372
Для этого всего я написал такой запрос, который склеивает все одинаковые ip и при этом суммирует количество скачанной информации

авторSELECT Ip, SUM(Download) as Download
FROM requests
GROUP BY Ip
ORDER BY Download DESC LIMIT 0, 500
При этом мне надо, чтобы он суммировал количество скачанной информации в период 20 минут, т.е. должны просуммироваться первые 3 записи и последние 3 записи и на вывод получиться так

автор217.182.132.29 67116
217.182.132.29 67116
Пробовал разными способами, но результат один - склеивает ip, но при этом суммирует или не суммирует данные и на выводе получается так

автор217.182.132.29 134232
или так

автор217.182.132.29 22372
Вот мои попытки все это сделать, которые не увенчались успехом

авторSELECT Ip, SUM(Download) as Download
FROM requests
WHERE Time >= SUBDATE(Time, INTERVAL 20 MINUTE)
GROUP BY Ip
ORDER BY Download DESC LIMIT 0, 500

SELECT Ip, if(Time >= SUBDATE(Time, INTERVAL 20 MINUTE), SUM(Download), Download) as Download
FROM requests
GROUP BY Ip
ORDER BY Download DESC LIMIT 0, 500

SELECT Ip, SUM(Download) as Download
FROM requests
WHERE Time BETWEEN Time AND ADDDATE(Time, INTERVAL 20 MINUTE)
GROUP BY Ip
ORDER BY Download DESC LIMIT 0, 500
База большая, поэтому и использую LIMIT 0, 500
...
Рейтинг: 0 / 0
Группировка с условием
    #39572584
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понял, по условию задачи напрашивается группировка по 20-минутному интервалу времени, а не фильтрация.
...
Рейтинг: 0 / 0
Группировка с условием
    #39572592
checkdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, да
...
Рейтинг: 0 / 0
Группировка с условием
    #39572597
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как можно узнать последние 20 минут по пою где нет даты?
думаю надо юзать Datetime
...
Рейтинг: 0 / 0
Группировка с условием
    #39572606
checkdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yarnik, да, я поменял уже на datetime и написал такой запрос

авторselect Ip, SUM(Download) as Download
from(select Ip, Download, Time,
@grp:=@grp+if(Time>@prev+interval 20 minute,1,0) as GRP,
@prev:=Time
from requests, (select @prev:=NULL, @grp:=1) X
order by Time) A
GROUP BY GRP ORDER BY Download DESC LIMIT 0, 500

Проблема только в том, что он клеит все записи с интервалом предыдущей в 20 минут, несмотря на ip
...
Рейтинг: 0 / 0
Группировка с условием
    #39572613
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT `Ip`, SUM(`Download`)
FROM `requests`
WHERE NOW() < `Time` + INTERVAL 20 MINUTE 
GROUP BY `Ip`
...
Рейтинг: 0 / 0
Группировка с условием
    #39572641
checkdimon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yarnik, Спасибо, но оно не сработало. Помогли на другом форуме. Вот как все должно выглядеть

select Ip, SUM(Download) as Download
from(select Ip, Download, Time,
@grp:=@grp+if(Time>@prev+interval 20 minute or Ip!=@previp,1,0) as GRP,
@prev:=Time,
@previp:=Ip
from requests, (select @prev:=NULL, @previp:=NULL, @grp:=1) X
order by Ip, Time) A
GROUP BY GRP ORDER BY Download DESC LIMIT 0, 500
...
Рейтинг: 0 / 0
Группировка с условием
    #39572643
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понятно почему не сработало, у меня сработало =)
...
Рейтинг: 0 / 0
Группировка с условием
    #39572654
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
checkdimon
Код: sql
1.
@grp:=@grp+if(Time>@prev+interval 20 minute or Ip!=@previp,1,0) as GRP,


Зачем нужна лишняя проверка? просто
Код: sql
1.
@grp:=@grp+(Time>@prev+interval 20 minute or Ip!=@previp) as GRP
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с условием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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