1

私の例の表:

+----------+---------------------+
| username |        time         |
+----------+---------------------+
| john     | 2013-02-04 17:39:43 |
| john     | 2013-02-03 00:21:31 |
| peter    | 2013-02-02 15:04:53 |
| grace    | 2013-02-02 03:57:43 |
| peter    | 2013-02-03 15:36:15 |
+----------+---------------------+

このテーブルは、ユーザーからのアクティビティを登録します。最後の活動日が30日以上前のユーザーの数を数える必要があります。

私はこのクエリを開発しました:

SELECT
  username,
  MAX(time),
  DATEDIFF(NOW(), MAX(time)) as diff
FROM tracking
GROUP BY username
HAVING diff > 30

これは、アクティビティが30日以上前のユーザーのリストと、その最後のアクティビティの日付を効果的に返します。

しかし、リスト自体ではなく、このリストの数が必要です。リストを数える方法はありますか?

ノート:

  • 私はSQLステートメントのみに頼ることができ、 PHPASPなどを使用することはできません。
  • ストアドプロシージャを使用できません。
  • このステートメントはたまにしか実行されないので、パフォーマンスは必要ありません。
4

2 に答える 2

2

ちょうどそのように?

Select count(*) as Num FROM
  (
 SELECT
   username,
    MAX(time),
     DATEDIFF(NOW(), MAX(time)) as diff
     FROM tracking
 GROUP BY username
 HAVING diff > 30
 )
于 2013-02-25T19:48:32.140 に答える
2

比較的簡単な方法は次のとおりです。

SELECT count(distinct username) - 
       count(distinct case when DATEDIFF(NOW(), time) <= 30 then username end) as numusers
FROM tracking

これにより、ユーザーの総数が取得され、過去30日間にアクティビティがあったユーザーの数が差し引かれます。

于 2013-02-25T19:49:38.567 に答える