获取最大。屏幕分辨率
问题: 我有一个网站,我收集浏览器统计信息。
因此,我有一个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)
试着这么做:
;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()
。
编辑
修改为显示最大/最小分辨率的屏幕宽度
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。
显示器可能发生同样的情况。文件编辑人员为了更“法律文件”的风格观点旋转显示器并不罕见。但是,当他们从家中访问您的网站时,他们可能没有相同的设置,但具有相同的分辨率。
如果出现这种情况,您希望查询返回什么内容?
@NickLarsen:Ay,交换。从来没有想到这一点。非常讨厌,不能静态设置CSS了。 – 2010-04-16 08:02:40
这应该得到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)
我还没有尝试过,但如果用户使用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
你的查询的预期行为是什么,最大分辨率是由多个屏幕尺寸产生的?例如 - 800x600和1000x480都会提供相同的产品 - 您会报告哪些产品?或者您会同时显示这两种产品? – 2010-04-15 11:30:24
你击败了我:) – 2010-04-15 11:40:43
@ Ed Harper:好问题。哪一个并不重要,但只有一个。我会说我会为宽度而努力,因为这就是我更感兴趣的。 – 2010-04-16 07:51:56