0

私はMySQLテーブルを持っています:

CREATE TABLE IF NOT EXISTS users_data (
  userid int(11) NOT NULL,
  computer varchar(30) DEFAULT NULL,
  logondate date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

これは、約 400 の一意のユーザーと 20 のコンピューター、および 5 年間のユーザーのコンピューターへのログオンからの約 20,000 のエントリを含む大きなテーブルです。

特定のコンピューターごとの年間のユニーク ユーザー数と、それらのユーザーのうち新規ユーザーの数 (つまり、その年以前にどのコンピューターにもログオンしたことがない、さらに今後どのコンピュータにもログオンする機会がないユーザーに対して:

CREATE TABLE IF NOT EXISTS summary_computer_use (
  computer varchar(30) DEFAULT NULL,
  year_used date NOT NULL,
  number_of_users int(11) NOT NULL,
  number_of_new_users int(11) NOT NULL,
  number_of_terminated_users int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT into summary_computer_use (computer, year_used)
    select computer, distinct year(logondate) from users_data;

年間のユニーク ユーザーを取得できます。

UPDATE summary_computer_use as a 
inner join (
    select computer, year(logondate) as year_used,
        count(distinct userid) as number_of_users
    from users_data
    group by computer, year(logondate)
) as b on a.computer = b.computer and 
a.year_used = b.year_used
set a.number_of_users = b.number_of_users;

しかし、特定の年に初めてコンピューターを使用するユーザーの数 (その年より前のログオン日がない) または二度とログオンしないユーザーの数を見つける select ステートメントを作成する方法について、私は困惑しています。

助言がありますか?

4

2 に答える 2

0

それはあなたが求めているものです:

select y, count(userid) as newusers from
(
    select userid, min(year(logondate)) as y from users_data group by userid
) tmp
group by y;
于 2012-05-10T02:50:34.533 に答える
0

これにより、必要な要約が生成されると思います。

   SELECT computers.computer,
          timespan.yyyy                 AS "year_used",
          COALESCE(allusers.num, 0)     AS "number_of_users",
          COALESCE(newusers.num, 0)     AS "number_of_new_users",
          COALESCE(terminations.num, 0) AS "number_of_terminated_users"
     FROM (SELECT DISTINCT computer
             FROM users_data) computers
     JOIN (SELECT (2000+i) AS yyyy
             FROM integers
            WHERE i BETWEEN 0 AND 10) timespan
LEFT JOIN (  SELECT YEAR(logondate) AS logonyear,
                   computer,
                   COUNT(DISTINCT userid) AS "num"
              FROM users_data
          GROUP BY 1, 2) allusers
       ON timespan.yyyy = allusers.logonyear AND computers.computer = allusers.computer
LEFT JOIN ( SELECT last_logon AS logonyear,
                   computer,
                   COUNT(DISTINCT userid) AS "num"
              FROM (  SELECT computer,
                             userid,
                             YEAR(MAX(logondate)) AS "last_logon"
                        FROM users_data
                    GROUP BY 1, 2) last_user_logons
           GROUP BY 1, 2) terminations
       ON timespan.yyyy = terminations.logonyear AND computers.computer = terminations.computer
LEFT JOIN ( SELECT first_logon AS logonyear,
                   computer,
                   COUNT(DISTINCT userid) AS "num"
              FROM (  SELECT computer,
                             userid,
                             YEAR(MIN(logondate)) AS "first_logon"
                        FROM users_data
                    GROUP BY 1, 2) first_user_logons
           GROUP BY 1, 2) newusers
       ON timespan.yyyy = newusers.logonyear AND computers.computer = newusers.computer;

これらのさまざまなサブクエリは次を表します。

  • 異なるのセットcomputers
  • timespan私たちが興味を持っている年
    • 注:整数テーブルの使用
    • 注: 昨年 (この記事の執筆時点では 2011 年) は除外されています。これは、今年が完了するまで、昨年の終了に関する「帳簿を閉じる」ことができないためです。
  • 年ごとのコンピュータ別の個別ユーザー数 ( allusers)
  • newusers年ごとのコンピューター別の数(コンピューター上のユーザーのすべてのレコードの
    上に構築)first_logon
  • terminations年別のコンピュータ別の数(すべての記録
    の上に構築)last_logon
于 2012-05-11T15:07:45.587 に答える