2011-12-14 26 views
1

我正試圖將SQL查詢放在一起以收集過去一週內排名前十的新聞項目。 我也需要它來過濾看到相同新聞項目的重複IP地址。表中排名前十位的值

每當用戶輸入一個頁面時,用戶的瀏覽器查詢字符串就會被採用。
這裏的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 2011-12-14 00:25:05

+0

沒有得到我想要的結果 - 不給我正確的計數(不計算不同的ipaddresses) – Ben 2011-12-14 00:55:50

回答

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. 按日期範圍和查詢字符串濾波器濾波原始表根據需要
  2. 減少從結果(1)下降到不同對(IP地址,查詢字符串),忽略日期
  3. 計算(2)中的唯一查詢字符串的出現次數,並按count以降序返回前10個查詢字符串。
0

我認爲,當你說」 ...過濾重複IP地址...「你只需要從同一個IP地址請求的同一篇新聞文章被計算一次(每天?)

如果是這樣你需要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 2011-12-14 00:59:19

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