计算所有用户最近使用的浏览器

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)

这似乎工作正常,但我有很多我知道不再使用的旧浏览器:

yucky - 没有人使用的旧浏览器

我如何仅根据时间戳选择每个用户使用的最新浏览器(或者 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)

SQL-Fiddle 上的测试