Dan*_*Dan 5 sql-server-2008-r2
我有一个带有列Type, Login,
和Timestamp
. 已收集有关用户登录到与系统浏览器的类型信息年。显然,许多用户已经升级了他们的浏览器。当用户升级时,我不想考虑旧浏览器的数据。这是我目前必须计算有多少人使用哪种浏览器的查询:
select
Type,
count(Type) as Count
from
(select
distinct Login,
Type
from BROWSER) as q
group by Type
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我有很多我知道不再使用的旧浏览器:
我如何仅根据时间戳选择每个用户使用的最新浏览器(或者 Browser_ID 也可以工作,因为它们是按顺序编写的)。我也打算忽略过去一年中没有登录的用户的数据,但这很容易在以后添加(我只是提到它,所以没有人提出为什么我想要不活跃用户的旧浏览器数据 - 我也计划解决这个问题,但我已经知道如何做到这一点)。
如果有人愿意接受挑战,有些用户会从几台不同的计算机登录 - 或者可能是从他们的电话和办公桌上登录。如果我能确定他们经常从两个不同的地方登录并收集这些数据,那就太好了,但这可能太复杂了。如果有人想出如何添加这个复杂的步骤,我很乐意为答案奖励 50 分。
ype*_*eᵀᴹ 10
不是您的确切要求(而不是忽略来自去年不活动的用户的数据,以下查询会忽略超过一年的所有数据),但您可以根据需要获得想法并将条件更改为更复杂:
计算最多一年前的所有登录和浏览器类型组合。
; WITH cte AS
( SELECT *
FROM Browser
WHERE Timestamp >= DATEADD(Year, -1, GETDATE())
)
SELECT Type,
Count = COUNT(DISTINCT Login)
FROM Browser
GROUP BY Type ;
Run Code Online (Sandbox Code Playgroud)仅计算每次登录的最新浏览器类型,最多一年。
; WITH cte AS
( SELECT Type,
Login,
Rn = ROW_NUMBER() OVER (PARTITION BY Login
ORDER BY Timestamp DESC)
FROM Browser
WHERE Timestamp >= DATEADD(Year, -1, GETDATE())
)
SELECT Type,
Count = COUNT(*)
FROM cte
WHERE Rn = 1
GROUP BY Type ;
Run Code Online (Sandbox Code Playgroud)每次登录最多计算 5 个最近的浏览器类型,最多一年前。
; WITH cte AS
( SELECT Type,
Login,
Rn = ROW_NUMBER() OVER (PARTITION BY Login
ORDER BY MAX(Timestamp) DESC)
FROM Browser
WHERE Timestamp >= DATEADD(Year, -1, GETDATE())
GROUP BY Login, Type
)
SELECT Type,
Count = COUNT(*)
FROM cte
WHERE Rn <= 5
GROUP BY Type ;
Run Code Online (Sandbox Code Playgroud)