2010-04-15 132 views
0

問題: 我有一個網站,我收集瀏覽器統計信息。

因此,我有一個SQL表(T_Visits)中,用以下的列:
唯一標識符 Visit_UID,
唯一標識符 User_UID,
日期時間 Visit_DateTime,
浮子 Screen_w,
float Screen_h,
浮子分辨率= Screen_w * Screen_h
VARCHAR resolutionstring = screen_w + 'X' + screen_h


由於用戶可以訪問來自幾個計算機上的網站,可存在於屏幕尺寸不同的條目每次訪問用於同一個用戶。
現在我想要得到的最大/最小分辨率每個用戶有:
獲取最大。屏幕分辨率

Select User_UID, max(resolution) from T_Visits GROUP BY User_UID 



我怎樣才能得到相應的分辨率字符串?
我的意思是,我可以得到最大(screen_w)和max(screen_h),但不能保證相應的resolutionstring將最大(screen_w)+ 'X' + MAX(screen_h)

+1

你的查詢的預期行爲是什麼,最大分辨率是由多個屏幕尺寸產生的?例如 - 800x600和1000x480都會提供相同的產品 - 您會報告哪些產品?或者您會同時顯示這兩種產品? – 2010-04-15 11:30:24

+0

你擊敗了我:) – 2010-04-15 11:40:43

+0

@ Ed Harper:好問題。哪一個並不重要,但只有一個。我會說我會爲寬度而努力,因爲這就是我更感興趣的。 – 2010-04-16 07:51:56

回答

1

試着這麼做:

;WITH resCTE 
AS 
(
     SELECT User_UID 
       ,resolutionstring 
       ,ROW_NUMBER() OVER (PARTITION BY User_UID 
            ORDER BY Resolution desc 
              ,Screen_w desc 
           ) AS rnMax 
       ,ROW_NUMBER() OVER (PARTITION BY User_UID 
            ORDER BY Resolution 
              ,Screen_w 
           ) AS rnMin       
) 
SELECT maxr.User_UID 
     ,maxr.resolutionstring AS maxRes 
     ,minr.resolutionstring AS minRes 
FROM resCTE AS maxr 
JOIN resCTE AS minr 
ON minr.User_UID = maxr.User_UID 
AND minr.rnMin = 1 
WHERE maxr.rnMax = 1 

(未經測試)

注意,這裏假設你只想看到每個用戶ID 1行,不管一個以上高x寬是否給出了相同的分辨率。 如果這不是您想要的行爲,則可以修改查詢以使用RANK()而不是ROWNUMBER()

編輯

修改爲顯示最大/最小分辨率的屏幕寬度

0
SELECT DISTINCT T_Visits.User_UID, T_Visits.Resolution, T_Visits.resolutionstring 
FROM T_Visits 
    INNER JOIN (SELECT User_UID, max(resolution) AS max 
       FROM T_Visits 
       GROUP BY User_UID) temp 
      ON T_Visits.User_UID = temp.User_UID 
      AND T_Visits.Resolution = temp.max 

這個查詢首先創建每個用戶ID和最大分辨率的臨時表,然後使用T_Visits表匹配用戶ID和分辨率字段的內部連接,這應該爲您提供相應的resolutiontring(s)。

但是,這種查詢有一些問題。首先,雖然DISTINCT負責爲同一個resolutionstring返回多個行,但如果多個顯示器具有相同的分辨率,它仍應爲每個用戶返回多行。例如,如果某人用iPhone訪問您的網站,並且您用320x480記錄了一次點擊,但他們將手機橫向翻轉並重新打開您的網站,現在應該註冊480x320,因爲它們的X和Y值現在已交換,原因是方向。這會產生多個不同的最大分辨率匹配resolutionstring s。

顯示器可能發生同樣的情況。文件編輯人員爲了更「法律文件」的風格觀點旋轉顯示器並不罕見。但是,當他們從家中訪問您的網站時,他們可能沒有相同的設置,但具有相同的分辨率。

如果出現這種情況,您希望查詢返回什麼內容?

+0

@NickLarsen:Ay,交換。從來沒有想到這一點。非常討厭,不能靜態設置CSS了。 – 2010-04-16 08:02:40

0

這應該得到User_UID名單與最高分辨率的串子分類。調整它以獲得所有最低分辨率。也許它不是最有效的方法...

Select User_UID, resolutionstring from T_Visits as p 
WHERE resolution = (Select max(resolution) from T_Visits where User_UID =p.User_UID) 
+0

我還沒有嘗試過,但如果用戶使用max(resolution)訪問兩次,在user_uid方面是不是有點不唯一? 我正在考慮沿着 的行選擇User_UID,max(resolution),(從T_Vistis中選擇top(1)resolutiontring,其中user_UID = User_UID order by resolution)作爲來自T_Visits的MaxResolutionString GROUP BY User_UID – 2010-04-16 08:06:09