2011-12-14 6 views
1

過去1週間以内にトップ10のニュース記事を集めるためにSQLクエリをまとめようとしています。 同じニュース項目を見た重複IPアドレスをフィルタリングする必要もあります。テーブル内で上位10個の値が表示される

ユーザがページを入力するたびに、ユーザのブラウザクエリ文字列が取得されます。
は、ここでDBの設定の例です:

datetime | ipaddress  | querystring 
----------------------------------------- 
9/12/2011 | 65.65.65.651 | newsid=3512 
9/12/2011 | 65.65.65.658 | newsid=3512 
10/12/2011 | 65.65.65.653 | newsid=3514 
11/12/2011 | 65.65.65.656 | newsid=3515 
11/12/2011 | 65.65.65.651 | newsid=3515 
13/12/2011 | 65.65.65.651 | newsid=3516 
14/12/2011 | 65.65.65.650 | newsid=3516 
14/12/2011 | 65.65.65.650 | newsid=3516 

私の失敗した:

SELECT DISTINCT TOP 10 ipaddress, querystring, Count(*) AS thecount 
     FROM [thedb].[dbo].[tblwebstats] 
     WHERE querystring LIKE '%newsid=%' AND datetime > (1 week ago) 
     GROUP BY querystring, ipaddress 
     ORDER BY Count(*) DESC 

「私はあなたが言うときと仮定:)

+0

現在、エラーが表示されていますか、必要な結果が得られませんか? – Chris

+0

私が望んでいた結果が得られません - 私に正しいカウントを与えません(別個のipaddressを数えません) – Ben

答えて

1

どうやってですか?

select top 10 querystring, count(querystring) as popularity 
from 
(
    select distinct ipaddress, querystring 
    from 
    (
     select [datetime], ipaddress, querystring 
     from tblwebstats 
     where querystring LIKE '%newsid=%' AND [datetime] > dateadd(day, -7, getdate()) 
    ) as datefilter 
) as distinctfilter 
group by querystring 
order by popularity desc 

(最も内側の最も外側に)次のこのクエリはない:

  • 必要な結果を減少させるので

    1. は、日付範囲とクエリ文字列によって元の表をフィルタリング(1)の異なる対にダウン(IPアドレス、照会文字列)、日付を無視する
    2. (2)からのユニークなクエリーストリングの発生をカウントし、カウントの降順で上位10個を戻します。
  • +0

    あなたの質問は内部の別の選択肢にdatetimeを追加しなかったので、あなたの答えは最高でした。 – Ben

    0

    を私を助けてください...重複をフィルタリングIPアドレス... "と同じIPアドレスから要求された同じニュース記事のみを1回だけカウントするようにしたい場合は

    もしそうなら、f記事を取得する前に複製を削除してください。

    WITH Unique_Requests AS ( 
        SELECT DISTINCT datetime, ipaddress, querystring 
        FROM [thedb].[dbo].[tblwebstats] 
        WHERE datetime >= DATEADD(week, -1, CURRENT_TIMESTAMP) AND 
         querystring LIKE '%newsid=%' 
    ) 
    
    SELECT TOP 10 querystring, Count(*) AS thecount 
    FROM Unique_Requests 
    GROUP BY querystring 
    ORDER BY Count(*) DESC 
    
    +0

    ニュース記事ごとに異なるIPアドレスを数える必要があります。 私は提案されたクエリを試し、それが私を得るところを見ていきます - ありがとう! – Ben

    +0

    しかし、うまくいきましたが、不要な内部の別名にdatetimeを追加しました。私はあなたに+1を与えるだろうが、私の評判は低すぎる:( – Ben

    0

    以下のステートメントには本当に満足できません。テンポラリテーブルに入れすぎることなく、ネストが多すぎます。追加の一時表にデータを取り込むと、クロス適用はそれほど重くなりません。

    DECLARE @t as table(Created datetime,IPAddress varchar(15),QueryString VARCHAR(20)) 
    
    INSERT INTO @t(Created,IPAddress,QueryString) VALUES 
    ('2012-11-9' ,'65.65.65.651' ,'newsid=3512'), 
    ('2012-11-9','65.65.65.658','newsid=3512'), 
    ('2012-11-10','65.65.65.653','newsid=3514'), 
    ('2011-12-11','65.65.65.656','newsid=3515'), 
    ('2011-12-11','65.65.65.651','newsid=3515'), 
    ('2011-12-13','65.65.65.651','newsid=3516'), 
    ('2011-12-14','65.65.65.650','newsid=3516'), 
    ('2011-12-14','65.65.65.650','newsid=3516') 
    
    SELECT TOP 10 QueryString,DistinctIp,COUNT(1) Counter FROM (
    SELECT DISTINCT Created,IPAddress,DistinctIp,QueryString 
    FROM @t t 
    CROSS APPLY (SELECT DISTINCT COUNT(1) DistinctIp FROM @t WHERE Created = t.Created ANd QueryString = t.QueryString) g 
    WHERE Created >= CAST((GETDATE()-7) AS DATE) AND 
        QueryString LIKE '%newsid=%' 
    ) x 
    GROUP BY QueryString,DistinctIp 
    ORDER BY Counter DESC 
    

    この結果には、別個のIPアドレスの追加カウントが含まれます。

    QueryString|DistinctIp|Counter 
    newsid=3515|2|2 
    newsid=3512|2|2 
    newsid=3516|2|1 
    newsid=3516|1|1 
    newsid=3514|1|1