【问题标题】:SQL: Count Users with Activity in the Past WeekSQL:统计过去一周有活动的用户
【发布时间】:2013-05-23 07:43:44
【问题描述】:

我正在尝试计算在所有日期的 7 天内至少有两次会话或在所有日期的 30 天内有十次会话的用户数量。

我的数据如下:

Date        UserID  SessionID 
1/1/2013    Bob1234    1
2/1/2013    Bob1234    2
2/2/2013    Bob1234    3
2/3/2013    Cal5678    4

这将导致下表(仅显示选择日期)

Date    CountActiveUsers
1/1/2013    1
1/15/2013   0
2/2/2013    1
2/3/2013    2

真实数据集包含连续数据范围内所有日期的值,结果表应包含每个日期的条目。

SessionID 是唯一的,并且 UserID 总是指同一个人。

到目前为止,我有两个查询可以做一些接近的事情。第一个返回用户过去一周的会话数:

SELECT Count(
d.[SessionID]
) As SessionPastWeek
      ,m.[UserID]
      ,m.[Date]
  FROM [Cosmos].[dbo].[Sessions_tbl] as m
  Inner Join [Cosmos].[dbo].[Sessions_tbl] as d 
on m.[UserID2] = d.[UserID] AND 
--Between does not work here for some reason
d.[Date] <= m.[Date] AND
d.[Date] > DATEADD(d,-7,m.[date])

  Group By m.[UserID]
      ,m.[Date]

另一个来自以下链接,它计算给定日期的活跃用户数 Active Users SQL query

我在 SQL Server 2012 中

我无法将两者结合起来。

为澄清而编辑:我需要的查询可能没有任何 getdate() 或类似内容,因为我需要知道有多少用户符合 1 月 1 日、今天以及其间的所有日期的“活跃”条件。

感谢您的帮助!

【问题讨论】:

  • 您使用的是哪个 RDBMS? SQL 服务器 2008?还是 MYSQL?还是其他?
  • 我使用的是 SQL Server 2012

标签: sql tsql sql-server-2012


【解决方案1】:

我认为你只需要添加一个 HAVING 子句:

HAVING COUNT(d.[SessionID]) >= 2

在 10 in 30 查询中,只需将 DATEADD() 更改为 30 天,并将 HAVING 子句更改为 >= 10。

    SELECT COUNT(d.[SessionID]) AS SessionPastPeriod
        , m.[UserID]
        , m.[Date]
    FROM Sessions_tbl AS m
        INNER JOIN Sessions_tbl as d
            ON m.UserID = d.UserID
            AND d.[Date] <= m.[Date]
            AND d.[Date] > DATEADD(d,-7,m.[Date])
    GROUP BY m.UserID
        , m.[Date]
    HAVING COUNT(d.[SessionID]) >= 2

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你离得太近了。

    SELECT Count(d.[SessionID]) As SessionPastWeek
          ,m.[UserID]
          ,m.[Date]
    FROM [Cosmos].[dbo].[Sessions_tbl] as m
    Inner Join [Cosmos].[dbo].[Sessions_tbl] as d on m.[UserID2] = d.[UserID]
    --Between does not work here for some reason
    where --ADD where clause
    d.[Date] <= getdate() AND
    d.[Date] > DATEADD(d,-7,getdate())
    Group By m.[UserID],m.[Date]
    having Count(d.[SessionID])>1 --The magical clause for you.
    

    【讨论】:

    • 不要认为这实现了“7天内两次或过去30天内十次”
    • @Andomar with 7 days.
    • 看起来这个代码打算只查找最近一周内的活动,而不是所有日期之前的所有周。它还为我返回 Null 结果。查询成功执行,但没有数据。
    【解决方案3】:
    select  count(*)
    from    (
            select  UserID
            ,       sum(case when Date between dateadd(day, -7, getdate()) and getdate()
                        then 1 end) as LastWeek
            ,       sum(case when Date between dateadd(day, -30, getdate()) and getdate()
                        then 1 end) as Last30Days
            from    Sessions_tbl
            group by
                    UserID
            ) SubQueryAlias
    where   LastWeek >= 2
            or Last30Days >= 10
    

    【讨论】:

    • 看起来这个代码打算只查找最近一周内的活动,而不是所有日期之前的所有周。我需要知道 1 月 1 日和今天有多少用户符合“活跃”标准。
    • 已更新,因此您也可以将其用于过去的日期。例如,将所有出现的getdate() 替换为2013-01-01
    【解决方案4】:

    以下查询有效:

    Select
    Count(UserID) As CountUsers
    ,[Date]
    From(  
        SELECT COUNT(d.[SessionID]) AS SessionPastPeriod
            , m.[Date]
            , m.UserID
        FROM [Sessions_tbl] AS m
            INNER JOIN [Sessions_tbl]  as d
                ON m.UserID = d.UserID
                AND d.[Date] <= m.[Date]
                AND d.[Date] > DATEADD(d,-7,m.[Date])
        GROUP BY 
             m.UserID
             ,m.[Date]
        HAVING COUNT(d.[SessionID]) >= 2) SQ
        Group By [Date]
    

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多