问题:
我有一个网站,我收集浏览器统计信息。
因此,我有一个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)
答案 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)