属性 MAC_ADDR、IP_SRC、IP_DST、URL、PROTOCOL を含む非常に単純なテーブル (LOG) があります。PROTOCOL='DNS' の場合、IP_SRC、URL、#OfOccurrences を含む最初のn行を、テーブル内の IP_SRC ごとに #OfOccurrences を減らして並べ替えます。
より明確にするために、テーブル内の IP_SRC ごとに、最も訪問された最初のnページをリストできるようにしたいと考えています。
次のように、IP_SRC ごとに最も訪問された URL を取得できます。
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';
ただし、このソリューションは明らかに最適化されていません。
これはより実用的なコードです (各 IP_SRC の最も訪問された URL 用):
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;
この 2 番目のオプションは、はるかに高速です。しかし、IP_SRC ごとにn 個の最も訪問されたページが必要ですが、その方法がわかりません。
ご協力いただきありがとうございます。