报告以列出新老用户的每日、每月或每年访问
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)和
UserLogin(Id 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远程访问权限