2

次のテーブル構造を持つ2つのテーブルがあります-

ユーザー( UserID int 、Name varchar(50)、DateCreated datetime) および

UserLogin ( Id int、UserId int、DateLoggedIn datetime)

アプリケーションに毎日/毎月/毎年ログインしているユーザーのレポートを次の形式で作成する必要があります -

日付、NewUsers、OldUsers、TotalUsers

日付- レポート用に選択された日付

NewUser - ユーザーがアプリケーションに初めてログインした場合、そのユーザーは新規として扱われ、それ以外の場合は古いユーザーとして扱われます。

OldUser - 最初の訪問後のその後のユーザー ログイン。

たとえば、ユーザー A が 1 か月間 15 日にログインした場合、15 日には新しいユーザーとして扱われますが、その後の Web サイトへのアクセスでは古いユーザーとして扱われ、レポートで古いユーザーとして報告する必要があります。同様に、ユーザー B が 2012 年 4 月 30 日に 1 回ログインした場合、それ以降は古いユーザーとして扱われます。

レポートを出力するためのクエリを教えてください。

私のデータは次のとおりです-

ユーザー表

| | ユーザー ID | 名前 | 作成日 |
|--------|------|-------------|
| | 1 | ラジビア | 2012-01-01 |
| | 2 | マノジ・ティアギ | 2011-08-10 |
| | 3 | ラグー・パンディ | 2009-05-13 |
| | 4 | バジャン・ラル | 2012-05-01 |
| | 5 | サトビル・シン | 2011-08-03 |

USERLOGIN テーブル

| | ID | ユーザー ID | ログイン日 |
|----|--------|--------------|
| | 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 |

1か月分のデータ全体が必要です(個別は必要ありません)...理想的には、提供したデータに基づいて、次を取得する必要があります

| | 月 | 月 | 新規ユーザー | 旧ユーザー | 合計ユーザー |
|-------|----------|----------|------------|
| | 3 | 1 | 0 | 1 |
| | 4 | 2 | 0 | 2 |
| | 5 | 2 | 4 | 6 |

ユーザー ID 3 は 5 月に 2 回ログインしたため、最初の訪問を新規、2 回目の訪問を古いものとして扱う必要があります。

ティア、

パリトッシュ・アリア。

4

2 に答える 2

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 に答える
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 に答える