2

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

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

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

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

日期、新用户、旧用户、总用户

日期- 为报告选择的日期

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

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 |

用户登录表

| 身份证 | 用户名 | 日期登录 |
|----|--------|--------------|
| 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,

帕里托什·艾莉亚。

4

2 回答 2

0

您可以在连接日期在登录表和用户表之间执行外连接,然后计算每个表中不同的用户 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
于 2012-05-31T11:10:51.740 回答
0

我认为这显示了逻辑,但可能没有最高的性能。

    ;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'
于 2012-05-31T18:33:29.770 回答