报告以列出新老用户的每日、每月或每年访问

Posted

技术标签:

【中文标题】报告以列出新老用户的每日、每月或每年访问【英文标题】:Report to list new and old user's visits daily, monthly or yearly 【发布时间】:2012-05-31 11:00:33 【问题描述】:

我有 2 个具有以下表结构的表 -

用户UserID int、Name varchar(50)、DateCreated datetime)和

UserLoginId int、UserId int、DateLoggedIn 日期时间)

我需要按以下格式生成每天/每月/每年登录应用程序的用户的报告 -

日期、NewUsers、OldUsers、TotalUsers

日期 - 为报告选择的日期

新用户 - 如果用户是第一次登录应用程序,他将被视为新用户,否则视为旧用户。

OldUser - 首次访问后的后续用户登录。

例如用户A在15日登录一个月,15日被视为新用户,但后续访问网站时被视为老用户,需要在报告中报告为老用户。同样,如果用户 B 在 2012 年 4 月 30 日登录过一次,那么以后他将被视为旧用户。

你们可以给我一个查询以输出报告吗?

我的数据如下——

用户表

|用户名 |姓名 |创建日期 | |--------|-------------|-------------| | 1 |拉杰维尔 | 2012-01-01 | | 2 | Manoj Tyagi | 2011-08-10 | | 3 |拉古潘迪 | 2009-05-13 | | 4 |巴詹拉尔 | 2012-05-01 | | 5 |萨比尔辛格 | 2011-08-03 |

USERLOGIN 表

|身份证 |用户名 |日期登录 | |----|--------|--------------| | 1 | 1 | 2012-04-27 | | 2 | 1 | 2012-05-25 | | 3 | 1 | 2012-05-28 | | 4 | 2 | 2012-03-21 | | 5 | 2 | 2012-05-30 | | 6 | 3 | 2012-05-20 | | 7 | 4 | 2012-05-29 | | 8 | 5 | 2012-04-22 | | 9 | 3 | 2012-05-15 |

我确实需要一个月的全部数据(所以不需要不同)....理想情况下,根据我提供的数据,我应该得到以下数据

|月 |新用户 |老用户 |用户总数 | |-------|---------|----------|------------| | 3 | 1 | 0 | 1 | | 4 | 2 | 0 | 2 | | 5 | 2 | 4 | 6 |

由于用户 id 3 在 5 月份登录了两次,因此他的第一次访问应视为新访问,第二次访问应视为旧访问。

TIA,

帕里托什艾莉亚。

【问题讨论】:

你想拥有用户列表还是只计算他们(如@eggyal 回答)?如果您想要该列表,那么在一次选择中选择 OldUsers Newusers 和 TotalUsers 会很奇怪。这是可能的,但它会导致 Oakward 列表,我认为最好选择 3 次。 在您的示例数据中,每次访问都发生在(在大多数情况下,显着如此)相应用户的DateCreated 之后,所以每次访问每个用户都是“老”不是吗?为什么在示例输出中将用户显示为“新”? 用户第一次登录时,我需要在报告中显示新用户登录到该站点。之后,用户(之前已经登录)成为旧用户,不再是唯一的,因此需要列为旧用户。这只是我正在处理以这种方式呈现数据的报告的逻辑......所以在注册后,如果用户第一次登录,报告应该说新用户登录。任何后续访问会认为他是老用户 @user869375:但是用户注册的时候不是第一次登录吗? 【参考方案1】:

您可以在连接日期在登录表和用户表之间执行外连接,然后计算每个表中不同的用户 ID:

SELECT   DATE(l.DateLoggedIn)                                AS Date,
         COUNT(DISTINCT u.UserID)                            AS NewUsers,
         COUNT(DISTINCT l.UserId) - COUNT(DISTINCT u.UserID) AS OldUsers,
         COUNT(DISTINCT l.UserId)                            AS TotalUsers
FROM     UserLogin                                           AS l
  LEFT JOIN Users                                            AS u
         ON l.UserId = u.UserID
        AND DATE(l.DateLoggedIn) = DATE(u.DateCreated)
GROUP BY Date

【讨论】:

@user869375:我假设您只想统计一次用户,即使他们在一天内多次登录;如果不是这种情况,而您只想计算登录次数,请从每个 COUNT() 函数中删除 DISTINCT 关键字。 看来我下结论有点早。当我用更多数据进行测试时……确实存在差异……我的数据如下 2 个表 -【参考方案2】:

我认为这显示了逻辑,但可能不是最高性能。

    ;With NewUser as (
        Select ul.UserID
          , Min(ul.DateLoggedIn) as NewDate
        from dbo.USERLOGIN as ul
        group by UserID)

    Select 
      Month(l.DateLoggedIn) as ThisMonth
      , (Select Count(*) from dbo.USERLOGIN as ul 
         inner join NewUser as nu 
         on ul.UserID = nu.UserID
              and ul.DateLoggedIn = nu.NewDate 
         where Month(ul.DateLoggedIn) = Month(l.DateLoggedIn)
        ) as NewUsers
      , (Select Count(*) from dbo.USERLOGIN as ul 
         where Month(ul.DateLoggedIn) = Month(l.DateLoggedIn)
            AND not exists (Select * from NewUser as nu
             where ul.UserID = nu.UserID
                            and ul.DateLoggedIn = nu.NewDate)
        ) as OldUsers
      , Count(*) as TotalUsers
    from dbo.USERLOGIN as l
    group by Month(l.DateLoggedIn)

-- a little testing code
 CREATE TABLE [dbo].[USERLOGIN](
        [ID] [int] NOT NULL,
        [USERID] [int] NOT NULL,
        [DateLoggedIn] [date] NOT NULL
    )
    ;
    insert INTO dbo.USERLOGIN 

    select 1, 1, '2012-04-27'
    union all
    Select 2, 1, '2012-05-25'
    union all
    Select  3 , 1,'2012-05-28'
    union all
    Select 4 ,  2,'2012-03-21'
    union all
    Select 5 , 2,'2012-05-30'
    union all
    Select 6 , 3 ,'2012-05-20'
    union all
    Select 7 , 4 ,'2012-05-29'
    union all
    Select 8 , 5,'2012-04-22'
    union all
    Select  9 , 3,'2012-05-15'

【讨论】:

以上是关于报告以列出新老用户的每日、每月或每年访问的主要内容,如果未能解决你的问题,请参考以下文章

老男孩教育每日一题-2017年3月22日:请说明用户访问网站流程

老男孩教育每日一题-第106天-MySQL如何授权用户admin:password远程访问权限

老男孩教育每日一题:2017年3月15日-setacl授权相关的两个小题

Android 高级应用程序每月或每年订阅

SQL语句统计每天、每月、每年的销售总额

销售每月在线服务[关闭]