2012-03-05 8 views
0

私はテーブルのこの種を持っている:時間範囲に基づいてカウントを取得するためのMySQLクエリの記述方法

userId  loggedtime 
------------------- 
1  2012-03-05 10:45:59 
2  2012-03-05 10:04:19 
2  2012-03-05 10:05:09 
4  2012-03-05 10:20:24 
3  2012-03-05 10:20:20 
6  2012-03-05 10:30:59 
7  2012-03-05 10:35:59 

私は10時と11時の間の各5分間隔でログインしてどのように多くのユーザーを選択します。

私はこの種の結果が必要です。

time  count 
--------------- 
10:05  2 
10:20  2 
10:30  1 
10:35  1 

このような結果を作成するにはどうすればよいですか?

+0

これはSQL単独でも可能ですが、おそらく 'userId'と' loggedtime'秒(時間は昇順である必要があります)の順に選択し、新しい配列を作成し、結果セットをループし、 5分制限を超えていない間、 5分を経過するか、新しいユーザーIDに達すると、ユーザーIDとカウンターを使用してアレイ内に新しいエントリーを作成します。 – Yaniro

+0

あなたの区間の境界は正確には何ですか? 10:01:00..10:05:59の値を10:05の範囲にあるものとしてカウントしたいかのように見えます。 10:06:00:10:10:59が10:10までの範囲にあり、等々。あれは正しいですか? –

+0

はい、あなたは正しい@jonathanです。どのようにして2回の間にデータを選択できますか?たとえば。ログインしたユーザーがこの時間まで過去5分間にカウントする必要がある場合。アイデアはありますか? – learner

答えて

3

あなたはそれらの5分の間隔を与えるグループ分けのユニークなものを見つけ出す必要があります。

時間を分かり、それを5で割った場合、ユニークなものがあります。たとえば、GROUP BY CAST(EXTRACT(MINUTE FROM logTime)/ 5 AS unsigned)を使用すると、5分間隔が一意になります。/5は、デフォルトでは四捨五入なしで分割されます。

実際に作業クエリを書き込むには、段階的に試してみてください。

まず、ちょうど分取得してみましょう:今すぐ

mysql> SELECT userid, EXTRACT(MINUTE FROM loggedtime) as minute from test; 
+--------+--------+ 
| userid | minute | 
+--------+--------+ 
|  1 |  45 | 
|  2 |  4 | 
|  2 |  5 | 
|  4 |  20 | 
|  3 |  20 | 
|  6 |  30 | 
|  7 |  35 | 
+--------+--------+ 
7 rows in set (0.00 sec) 

を、あなたがして、グループ各5分間隔でユニークだ列値を作成することができます試してみましょう。その独特の列で

mysql> select userid, EXTRACT(MINUTE FROM loggedtime) AS minute, CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned) FROM test; 


+--------+--------+-------------------------------------------------------+ 
| userid | minute | CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned) | 
+--------+--------+-------------------------------------------------------+ 
|  1 |  45 |              9 | 
|  2 |  4 |              1 | 
|  2 |  5 |              1 | 
|  4 |  20 |              4 | 
|  3 |  20 |              4 | 
|  6 |  30 |              6 | 
|  7 |  35 |              7 | 
+--------+--------+-------------------------------------------------------+ 
7 rows in set (0.01 sec) 

最後に、我々のグループ:それはありません丸め(上記の値/ 5)で5で割った分です。この問合せでは、MIN()とMAX()を使用して、その間隔の最初と最後のタイムスタンプを表示しますが、質問と正確に同じようにしたい場合は、カットオフ時間を計算することもできます。あなたはそれが5分間隔を表示したい場合は

mysql> SELECT COUNT(*) AS user_count, MIN(loggedtime) AS first_time, 
MAX(loggedtime) AS last_time 
FROM test 
GROUP BY CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned) 
ORDER BY last_time; 
+------------+---------------------+---------------------+ 
| user_count | first_time   | last_time   | 
+------------+---------------------+---------------------+ 
|   2 | 2012-03-05 10:04:19 | 2012-03-05 10:05:09 | 
|   2 | 2012-03-05 10:20:20 | 2012-03-05 10:20:24 | 
|   1 | 2012-03-05 10:30:59 | 2012-03-05 10:30:59 | 
|   1 | 2012-03-05 10:35:59 | 2012-03-05 10:35:59 | 
|   1 | 2012-03-05 10:45:59 | 2012-03-05 10:45:59 | 
+------------+---------------------+---------------------+ 
5 rows in set (0.00 sec) 
0

私はあなたが今どのようにそれを行うことができるかわかりません、あなたの必要な結果についてもっと考えなければなりません。

SELECT TIMEDIFF('2009-02-01 00:00:00', '2009-01-01 00:00:00'); 

絶対にあなたが各5分間の必要な結果を計算するために、あなたのループのためのMySQLのクエリを使用する必要があります。しかし、あなたは、MySQL

timediff機能

例を使用する必要があります。

Look at this too.

+0

こんにちはどのように2回の間にデータを選択できますか?たとえば。ログインしたユーザーがこの時間まで過去5分間にカウントする必要がある場合。アイデアはありますか? – learner

+0

申し訳ありません@リナー、私の心は今占領されています。だから私はあなたにもあなたに答えることができません。しかし、CURRENT_TIME()とTIMEDIFF()関数を使用する必要があります。これらの機能の詳細については、Googleを検索してください。 –

0

あなたが日常この分析をやってするつもりなら、それはあなたの時間間隔のためのテーブルを設定する価値があるかもしれ

SELECT 
    loggedTime, 
    count(UserId) 
FROM tableName 
WHERE loggedTime BETWEEN '2010-11-16 10:00:00' AND '2010-11-16 11:00:00' 
GROUP BY 
round(UNIX_TIMESTAMP(timestamp)/300), name 
+0

こんにちはNaveen。 Now()と過去5分間のユーザー数を選択するにはどうすればよいですか? – learner

+0

最後の5分だけカウントしたい場合WHERE date_field> date_sub(now()、interval 5分) ' –

2

この文字列で検索してください。

Time_Intervals 
I_Start  I_End 
10:01:00  10:05:59 
10:06:00  10:10:59 
10:11:00  10:15:59 
... 
10:56:00  11:00:59 

そして、確かに、それは夜11時56分00秒のためのラップアラウンドかかわらず(各曜日の各時間の12の区間を含んでいるでしょう..:あなたのサンプルデータから判断し、その結果を必要に応じて、私はテーブルを作成したいです00:00:59はいくつかのエンターテイメントを提示するつもりです—それは読者のための練習として残されています!)。

あなたは、単にグループを生成するには、この表を使用することができます。

SELECT i.i_end, COUNT(*) 
    FROM Time_Intervals AS i 
    JOIN ThisKindOfATable AS t 
    ON t.loggedtime BETWEEN i.i_start AND i.i_end 
WHERE t.loggedtime BETWEEN '2012-03-05 10:01:00' AND '2012-03-05 11:00:59' 
GROUP BY i.i_end 
ORDER BY i.i_end; 

私は...の間に参加するために使用。別の設計では、範囲10:01:00 .. 10:06:00と結合条件t.loggedtime >= i.i_start AND t.loggedtime < i.i_endを使用します。これは分数秒をうまく処理します。

DATE + TIMEから結合条件(多分TIME(t.loggedtime))のためにTIMEに変換するには、loggedtimeの微調整が必​​要な場合があります。 INNER JOINの代わりにLEFT JOINを使用してログインしているユーザーがいないインターバルについては、これを調整してゼロを出力することもできます。操作の簡素化のために、秒の一部を削除することもできます。バリエーションは軍団です。

これに代わる主な方法は、所定の時間(t.loggedtime値)を適切な計算によって区間番号に変換することです。これは高度にDBMS固有のコードになります。時間を操作する関数は、基本的にDBMS全体で標準化されていません。

1

は、ユーザーのは、それぞれ、ちょうど(/ 5分)のINTEGERを分割し、その後5例を掛け、ログインした:10:03はに切り捨てます0の場合、時刻5は10:00を表します。 10時05分はい、その例えばハードコードされた1 * 5 = 10:05

select 
     concat('10:', LPAD(floor(minute(UL.loggedTime)/5) * 5, 2, '0') as MinuteRange, 
     count(*) as LoginCount 
    from 
     UserLoginTable UL 
    where 
     UL.loggedTime between '2012-03-05 10:00:00' AND '2012-03-05 10:59:59' 
    group by 
     MinuteRange 

を丸くするだろうが、あなたはまた、10に非常に多くの要素... 5分から間隔を置き換えることができたり15(またはその他)、でも開始'10書式設定:」(時間表記)を使用することを:

LPAD(時間(UL.LoggedTime)、2、 '0')

ので、あなたは長いをした場合時間の範囲... say 21:00:00〜23:59:59は、範囲内のすべての時間を表示します。

ジャストノート。日付/時刻の列と比較すると、「日付」部分のみを使用するクエリの場合は、00:00:00〜11:59:59の範囲を必ず含めるようにしてください。 。

関連する問題