2

mysql テーブル t があるとします。

DateTime timestamp;
int userid;

時間の経過に伴う合計ユーザー数を知りたいです。私はこれを持っています:

2012-12-04 102
2012-12-05 101
2012-12-05 102
2012-12-05 103
2012-12-07 101
2012-12-08 104

したがって、101 が初めて見られるのは 12/5、104 が初めて見られるのは 12/7 などです。だから私は、日付ごとにこれまでに見た合計ユーザーのために、これが欲しいです:

2012-12-04 1
2012-12-05 3
2012-12-07 3
2012-12-08 4

(新しいエントリがない余分な日付があってもかまいません。)

私が得ることができた最も近いものは、1 日あたりの新規ユーザー数です。

select distinct date, count(*) from 
 (select MIN(DATE(timestamp)) date from t group by userid order by date) t1 \
GROUP BY date;

うまくいくようです。サブクエリは各ユーザー ID の最も早いタイムスタンプを提供し、外側のクエリは日付で結合します。しかし、それをロールアップしてこれまでに見た合計を取得するにはどうすればよいでしょうか?

そうそう、MySQL クエリを調べました - find "new" users per dayですが、探しているものを実行していないようです。

4

2 に答える 2

2
SELECT x.timestamp
     , COUNT(DISTINCT y.userid)
  FROM t x
  JOIN t y
    ON y.timestamp <= x.timestamp
 GROUP
    BY timestamp;

GaryO、これが機能する理由を理解するには、このように書き直してください...

SELECT DISTINCT x.timestamp, y.userid
  FROM t x
  JOIN t y
    ON y.timestamp <= x.timestamp
 ORDER
    BY x.timestamp
     , y.userid;

sgeddes の sqlfiddle を使用すると、次の中間結果が得られます。

+---------------------+--------+
| timestamp           | userid |
+---------------------+--------+
| 2012-12-04 00:00:00 |    102 |
| 2012-12-05 00:00:00 |    101 |
| 2012-12-05 00:00:00 |    102 |
| 2012-12-05 00:00:00 |    103 |
| 2012-12-07 00:00:00 |    101 |
| 2012-12-07 00:00:00 |    102 |
| 2012-12-07 00:00:00 |    103 |
| 2012-12-08 00:00:00 |    101 |
| 2012-12-08 00:00:00 |    102 |
| 2012-12-08 00:00:00 |    103 |
| 2012-12-08 00:00:00 |    104 |
+---------------------+--------+

したがって、最後のクエリでは、日付でグループ化したときに、この結果を COUNT 回実行しただけです。

于 2013-02-04T19:51:01.217 に答える
1

私があなたの要件を理解していると仮定すると、最初に表示された日付とユーザー数を返すつもりですか?

SELECT TimeStamp, COUNT(*) 
FROM T JOIN (
   SELECT MIN(TimeStamp) minDate, UserId
   FROM t 
   GROUP BY UserId) T2 ON T.TimeStamp = T2.minDate AnD T.UserId = T2.UserId
GROUP BY T.TimeStamp

そしてフィドル: http://sqlfiddle.com/#!2/c1f5a/9

幸運を。

于 2013-02-04T19:27:24.487 に答える