У меня есть очень простая таблица (LOG), содержащая атрибуты MAC_ADDR, IP_SRC, IP_DST, URL, PROTOCOL. Я хочу, чтобы первые n строк, содержащих IP_SRC, URL, #OfOccurrences упорядочивались путем уменьшения #OFOccurrences для каждого IP_SRC в моей таблице, когда PROTOCOL = 'DNS'.SQL: максимальное количество событий для каждого значения
Чтобы быть яснее, я хочу, чтобы иметь возможность перечислить первые n наиболее посещаемых страниц для каждого IP_SRC в моей таблице.
я могу получить самый посещаемый URL для каждого IP_SRC, как это:
select ip_src,url,cnt
from (
select ip_src,url,count(*) as cnt,protocol
from log as b group by ip_src,url order by ip_src,cnt desc
) as c
where cnt>=(select MAX(cpt)
from (select count(*) as cpt from log as b
where c.ip_src==b.ip_src group by ip_src,url)
)
and protocol='DNS';
Однако это решение, очевидно, не оптимизирован.
Вот более практический код (для наиболее посещаемого URL для каждого IP_SRC):
select ip_src,url,cnt
from (select ip_src,url,count(*) as cnt
from log where protocol='DNS'
group by ip_src,url
order by ip_src,cnt asc)
group by ip_src;
Этот второй вариант намного больше быстрее! Тем не менее, я хочу, чтобы n самых посещаемых страниц для каждого IP_SRC, и я не могу понять, как это сделать.
Благодарим за помощь.
Tag СУБД вы используете. (Некоторый недопустимый SQL там ...) – jarlh
@jarlh Спасибо, действительно, это _sqlite_. – thefiercerabbit