1

属性 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 個の最も訪問されたページが必要ですが、その方法がわかりません。

ご協力いただきありがとうございます。

4

3 に答える 3

1

共通テーブル式を使用します:

WITH Temp1 AS (
  SELECT ip_src, url, count(*) AS cnt
  FROM Log
  WHERE protocol = 'DNS'
  GROUP BY ip_src, url
)
SELECT ip_src, url, cnt
FROM Temp1 AS T1
WHERE url IN (
  SELECT url
  FROM Temp1 AS T2
  WHERE T2.ip_src = T1.ip_src
    AND T2.cnt >= T1.cnt
  ORDER BY cnt DESC
  LIMIT 3  -- or whatever you want it to be
)
ORDER BY ip_src ASC, cnt DESC;
于 2016-09-13T17:05:49.200 に答える
0
select x.ip_src, x.url, x.cnt
from (select ip_src,url,count(*) as cnt
      from log where protocol='DNS'
      group by ip_src,url
      order by ip_src, count(*) desc) AS x
group by x.ip_src;

これを試すことができますか?

于 2016-09-13T11:37:17.813 に答える
0

最後に、一時テーブルを使用して、必要なものを取得することができました。

--First create a temp table of occurences
CREATE TEMPORARY TABLE TEMP1 AS
SELECT ip_src,url,count(*) AS cnt
FROM LOG
WHERE protocol='DNS'
GROUP BY ip_src,url
ORDER BY ip_src,cnt,url DESC;
--Then use a classic limit per group query
SELECT T1.ip_src,T1.url,T1.cnt
FROM TEMP1 AS T1
WHERE T1.url in (
      SELECT T2.url
      FROM TEMP1 AS T2
      WHERE T2.ip_src=T1.ip_src and T2.cnt>=T1.cnt
      ORDER BY T2.cnt DESC
      LIMIT 3 --Or whatever you want it to be
)
ORDER BY T1.ip_src ASC,T1.cnt DESC;

誰かが一時テーブルを必要とせずに同じことを行う方法を知っている場合 (または一時テーブルが良い解決策である理由を説明してください)、自分自身を表現してください。

于 2016-09-13T16:13:44.397 に答える