SQLの時間データを15分単位で集計できますか?

このQ&Aのポイント
  • SQLの時間データを15分単位で集計する方法について質問です。
  • 具体的なテーブルのデータを例に挙げ、集計結果の形式を示しています。
  • アイデアや方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

SQLの時間データを15分単位で集計できますか?

SQLで質問させてください。 現在、datetime型の項目があるのですが、これを15分単位で集計したいのです。具体的には以下のようなテーブルとなっています。 時間        値 ―――――――――――――――― 2009/1/1 15:02:00 1 2009/1/1 15:04:00 1 2009/1/1 15:16:00 1 2009/1/1 15:31:00 1 2009/1/1 15:48:00 1 2009/1/1 16:04:00 1 これを次のような形に集計できないものでしょうか? 年月   時間    数 ―――――――――――――――― 2009/1/1 15:00   2 2009/1/1 15:15 1 2009/1/1 15:30 1 2009/1/1 15:45 1 2009/1/1 16:00 1 何かアイデアがございましたら、よろしくお願いします。

noname#75338
noname#75338

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

SQL Serverは2000か2005ですよね? 「分」の部分を15で割って切り捨て、15倍すれば目的は達せます。 SELECT CONVERT(varchar,時間,111) 年月, RIGHT('00'+CONVERT(varchar,DATEPART(hh,時間)),2) +':'+RIGHT('00'+CONVERT(varchar,ROUND(DATEPART(mi,時間)/15,0,1)*15),2) 時刻, COUNT(*) 数 FROM テーブル GROUP BY CONVERT(varchar,時間,111), DATEPART(hh,時間),ROUND(DATEPART(mi,時間)/15,0,1)

noname#75338
質問者

お礼

お早いアドバイスありがとうございます。 イメージどうりの集計ができました! 2009/01/01 15:00 2 2009/01/01 15:15 1 2009/01/01 15:30 1 2009/01/01 15:45 1 2009/01/01 16:00 1 ありがとうございました。

関連するQ&A

  • 分単位でログ集計するためカウントする方法

    アクセスログの分析のため月ごとで、データをlog_siteというテーブルに入れ込んでいます。(データ量は約4500万件) ※実際はもっと項目(リクエストURL、HTTPステータス、UAなど)がありますが、 ここでは省略しています。 +----+-----------------+--------------------+----------+----+------+ + No | IP | DATETIME | YYYYMMDD | HH | HHMM | +----+-----------------+--------------------+----------+----+------+ + 1 | XXX.XXX.XXX.XXX | 2012-11-14 18:50:11| 20121114 | 18 | 1850 | + 2 | XXX.XXX.XXX.XXX | 2012-11-14 11:44:04| 20121114 | 11 | 1144 | + 3 | XXX.XXX.XXX.XXX | 2012-11-14 17:16:06| 20121114 | 17 | 1716 | + 4 | XXX.XXX.XXX.XXX | 2012-11-03 16:47:01| 20121103 | 16 | 1647 | + 5 | XXX.XXX.XXX.XXX | 2012-11-05 19:35:18| 20121105 | 19 | 1935 | + 6 | XXX.XXX.XXX.XXX | 2012-11-03 16:52:39| 20121103 | 16 | 1652 | + 7 | XXX.XXX.XXX.XXX | 2012-11-04 15:19:40| 20121104 | 15 | 1519 | + 8 | XXX.XXX.XXX.XXX | 2012-11-12 12:34:58| 20121112 | 12 | 1234 | + 9 | XXX.XXX.XXX.XXX | 2012-11-09 09:50:53| 20121109 | 09 | 0950 | + 10 | XXX.XXX.XXX.XXX | 2012-11-09 13:08:53| 20121109 | 13 | 1308 | + 11 | XXX.XXX.XXX.XXX | 2012-11-08 06:57:31| 20121108 | 06 | 0657 | + 12 | XXX.XXX.XXX.XXX | 2012-11-13 11:12:14| 20121113 | 11 | 1112 | + 13 | XXX.XXX.XXX.XXX | 2012-11-05 10:22:42| 20121105 | 10 | 1022 | +----+-----------------+--------------------+----------+----+------+ 各項目は以下のように定義しています。 `No` int(11) NOT NULL AUTO_INCREMENT, `IP` varchar(15) DEFAULT NULL, `DATETIME` datetime DEFAULT NULL, `YYYYMMDD` varchar(8) DEFAULT NULL, `HH` varchar(2) DEFAULT NULL, `HHMM` varchar(4) DEFAULT NULL, やりたいこととしては、1分または1時間単位でアクセスを集計しグラフを書こうとしています。 グラフに対しては、43,56,35,・・,5といった状態で渡せばグラフを書いてくれるのですが、 そのデータを取り出すため以下のようなSQLを書いて、各1分単位でそのカウントをして見ました。 select HHMM, count(IP) from log_site where YYYYMMDD='20121101'and ( (HHMM='0000')or(HHMM='0001')or(HHMM='0002')・・・・(HHMM='2359') )group by HHMM; +------+-------+ + HHMM | count | +------+-------+ + 0001 | 43 | + 0002 | 56 | + 0003 | 35 | (----省略----) + 2359 | 5 | +------+-------+ アクセス時間については、DATETIMEの項目にデータを入れているのですが 1分ずつ、1時間ずつ集計するのに日時や秒の情報が邪魔だったので YYYYMMDD、HH、HHMMといった内容で情報を持たせています。 実行した結果、取得できるのに300-400秒必要なのですが、 1日を取得するだけで、5-7分要するのは、なんとかならないでしょうか? 最低でも3日、最高で7日間ぐらいのデータは取得したいと考えているため、 この時間はかかりすぎなのです。 やはりログデータ量が約4500万件あるという多さから予め日ごとで集計された 数字を別テーブルに持たせることを考えていたのですが、 引っ掛けたいリクエストURLや、HTTPステータス、UAなど他の項目でも アクセス傾向が知りたいため、予め日ごとで集計された結果を別テーブルに持つ ということは出来ないので、予め集計された結果を持っておく訳にも行かず困っています。 もし今の状況でどのようなSQLだったら、データをスムースに取得できるのでしょうか? またスムーズにデータを取得するためにデータ構造の見直しが必要としたら どのように変えて、かつどのようにsqlを組んで取得すればよいのでしょうか? (仮に、日ごとでテーブルを作った場合は1日あたり150万程度になりますが 日をまたぐ場合は、どのようなSQLになるのでしょうか?) もっといい方法があれば教えていただければと思います。 よろしくお願いいたします。

  • 集計のSQLをお教え下さい

    初心者ですよろしくお願いします。 以下の様なテーブルがあり、年月と場所コードで 件数を出したいと考えております。 申し訳ありませんが、SQLの記述をお教え下さい。 年月日 | 場所コード |  20060510   1000 20060511   1000 20060511   2000 20060512   2000 20060601   1000 20060601   2000   ・    ・    ↓ 年月日 | 場所コード | count 200605   1000      2 200605   2000      2 200606   1000      1 200606   2000      1 年月日を年月にして集計したいと考えています。 select 年月日,場所コード,count(*) from table group by substring(年月日 from 1 for 6) ではうまくいきませんでした・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 数件単位の集計のSQLについて

    数件単位で合計した集計をしたいのですが、良い案が思い浮かびません。 例えば、100件のレコードがあった場合、ID.1~10までの合計、 ID.11~20までの合計、・・ID.91~100までの合計といった感じです。 ○集計対象のテーブル ID  値 ---------------------------- 1  10,000 2  9,000 3  8,000 : 99  100 100  10 ○集計結果イメージ ID        値 ---------------------------- (1~10の合計値)   50,000 (11~20の合計値)   25,000  : (91~100の合計値)  5,000 以上、宜しくお願い致します。

  • レコード集計のSQLについて

    お世話になります。 SQL Serverに関する質問です。 以下の内容を満たすSQLを作成したいのですが、 方法がわからず困っています。 (内容) *************************************************************** ・Aテーブル、Bテーブルには、以下のレコードが格納されています。 [Aテーブル] | key_code | code1 | code2 | code3 | money | person | ← カラム名 ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- | 001 | 1 | 2 | 1 | 3000 | 10 | ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- [Bテーブル] | key_code | cd1 | cd2 | cd3 | cd4 | cd5 | ・・・・・ | cd10 | ← カラム名 ------------------------------------------------------------ | 001 | 01 | 02 | 10 | 30 | 51 | ・・・・・ | 90 | ------------------------------------------------------------ | 002 | 01 | 02 | 03 | 10 | 40 | ・・・・・ | 55 | ------------------------------------------------------------ ・Aテーブルの key_code とBテーブルの key_code を関連付けて、  Bテーブルのcd1~cd10に格納されている各コード単位に集計した  Aテーブルのmoney及びpersonの値を取得したい。  例えば、 key_code = '000' でAテーブルとBテーブルを関連付けして、 Bテーブルのcd(1~10) = '10' で集計した Aテーブルの money と personの 値を求めたい。 **************************************************************** 初歩的な質問で申し訳ございませんが、 どなたかご教授願えませんでしょうか? よろしくお願いいたします。

  • 集計のSQL文について

    SQLでの集計方法について質問です。 Oracle8iを使用しています。 あるテーブルに以下のようなレコードがあります。 ID 回数 値 1   1  100 1   2  200 1   3  300 2   1  150 2   2  550 .... この登録されている値をそのIDごとに、その回数まで回数ごとにサマリーした結果を出力したいのですが どうすればよいでしょうか。 ID 回数 値 1   1  100  ・・・(100) 1   2  300  ・・・(100+200) 1   3  600  ・・・(100+200+300) 2   1  150  ・・・(150) 2   2  700  ・・・(150+550) 宜しくお願いします

  • SQLで集計について分からないことがあります。

    SQLで集計について分からないことがあります。 まず、次のようなテーブルがあったとして 日付  店舗コード ブランドコード 金額 ---------------------------------------- 09-01 | 401101 | 01 | 10000 09-02 | 401101 | 01 | 20000 09-03 | 401101 | 01 | 30000 09-04 | 401101 | 01 | 40000 09-01 | 401101 | 02 | 10000 09-02 | 401101 | 02 | 20000 09-03 | 401101 | 02 | 30000 09-04 | 401101 | 02 | 40000 09-01 | 401101 | | 11111 09-02 | 401101 | | 22222 09-03 | 401101 | | 33333 09-04 | 401101 | | 44444 ブランドコードが'Null'の金額をブランドコードが'01'の金額に 日付をキーにして集計したいんですが、 可能でしょうか? なにか、良い方法があればお願いします。

  • 集計のSQLについて

    皆さんの知恵をお借りしたいと思っています。 どなたか、良い案がある方お願いいたします。 以下のテーブルがあります。 (売上テーブル) 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   40    Bさん 鉛筆   30    Bさん 鉛筆   30        鉛筆   10        上のテーブルで、品名・購入者を集計キーとして、 金額を集計したい場合、 SELECT 品名,購入者,SUM(金額) FROM 売上テーブル GROUP BY 品名,購入者  というSQL文で,   品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   40        という結果が得られると思いますが・・・、 これを、 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   30        鉛筆   10        という結果になるようなSQL文を作りたいのです。 購入者が入っているものについては、品名・購入者で集計して、 購入者が空欄のものは集計しないようにしたいと思っています。 UNIONを使えばできるとは思うのですが、 それ以外の方法で、1回のSQL文でできる方法があれば知りたいと思っています。 よろしくお願いします。

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • SQL、特にOralce 8iに関して、データの集計に関する質問です。

    SQL、特にOralce 8iに関して、データの集計に関する質問です。 以下のようなデータがあったとします。 [開始年月(int)]  [終了年月(int)]  [値] 201001      201004      1 201003      201007      2 201005      201010      3 201007      201101      4 このとき以下のような感じで、重複している月で値を合算し、一番値が大きな月を求めるには、どうすればよいでしょうか。 1 2 3 4 5 6 7 8 9 101112 (月) ■■■■________ __■■■■■_____ ____■■■■■■__ ______■■■■■■ ↓↓↓↓↓↓↓↓↓↓↓↓ 1 1 3 3 5 5 9 7 7 7 4 4 (計) ←この場合 7月が一番大きかった できればPL/SQLなしで解決したいと思っております。 ご教示お願いいたします。

  • 1回のSQLで集計結果順にソートする方法を教えてください

    PHP4+MySQLです。 やりたいことがあるのですが、いいSQLが考えつきません。 お知恵を拝借できれば幸いです。 以下のようなテーブルがあるとします。 ID|ITEMid|DATE 1| 232|2009-06-14 2| 156|2009-06-14 3| 156|2009-06-14 4| 232|2009-06-14 5| 232|2009-06-14 6| 567|2009-06-14 これを次のように集計したいのです。 (ITEMidの登場回数順にソートして、実際の回数も出す) 232:3 156:2 567:1 サブクエリの使えない環境で、1回のSQLで集計することはできるでしょうか。できる場合実際のSQL文を教えていただければ幸いです。 テンポラリテーブル使えば自分でもできそうな気がするので、できれば使わない想定でお願いします。

    • ベストアンサー
    • MySQL