获得最大分组屏幕分辨率

时间:2010-04-15 10:59:49

标签: sql sql-server-2005

问题: 我有一个网站,我收集浏览器统计信息。

因此,我有一个SQL表(T_Visits),包含以下列:
uniqueidentifier Visit_UID,
uniqueidentifier User_UID,
日期时间 Visit_DateTime,
浮动 Screen_w,
浮动 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



如何获得相应的分辨率字符串?
我的意思是我可以得到max(screen_w)和max(screen_h),但是不能保证相应的resolutiontring是max(screen_w)+'x'+ max(screen_h)

3 个答案:

答案 0 :(得分: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行,无论多个HxW是否提供相同的分辨率。 如果这不是您想要的行为,则可以修改查询以使用RANK()而不是ROWNUMBER()

修改

修改后显示按屏幕宽度分类的最大/最小分辨率

答案 1 :(得分: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和最大分辨率的临时表,然后使用与用户ID和分辨率字段匹配的T_Visits表进行内部连接,这将为您提供相应的resolvetring(s)。

然而,这种查询存在一些问题。首先,当DISTINCT负责为同一resolutionstring返回多行时,如果每个用户有多个具有相同分辨率的监视器,它仍应返回多行。例如,如果有人使用iPhone访问您的网站,并且您使用320x480录制了一个匹配,但随后他们将手机侧向转动并再次访问您的网站,现在应该注册480x320,因为他们的X和Y值现在已经交换了取向。这将产生具有不同resolutionstring s的多个最大分辨率命中。

监视器也会发生同样的事情。文档编辑器将其监视器旋转以获得更“合法的纸张”样式的情况并不少见。但是,当他们从家中访问您的网站时,他们可能没有相同的设置,但确实具有相同的分辨率。

如果是这种情况,您希望您的查询究竟返回什么状态?

答案 2 :(得分: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)