• 締切済み

mysqlのデータから連続する日数の最大を出す方法

いろいろと調べたのですが分からなかったので質問させて下さい。 あるMysqlのデータベースにこのようなデータがあるとき、 ID date point ------------ 1 2011-06-12 10 1 2011-06-13 5 1 2011-06-14 10 2 2011-06-09 5 2 2011-06-10 10 2 2011-06-15 5 3 2011-06-09 10 3 2011-06-10 10 3 2011-06-14 5 3 2011-06-15 10 3 2011-06-16 5 ここから各IDごとの最大の連続日数数を抜き出す方法はありますでしょうか? 結果として ID 連続日数 ----------- 1 3 2 2 3 3 といったものを求めています。

  • MySQL
  • 回答数2
  • ありがとう数1

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

idごとの連続日付の最大回数を求めるファンクションをつくってみました。テーブル名じゃ便宜的に「tbl」にしてあります。 delimiter // create function consecutive_date( inp_id int ) returns int begin declare done int; declare dt date; declare sv_dt date; declare i int; declare j int; DECLARE myCursor CURSOR FOR select `date` from TBL where id = inp_id order by `date`; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; set done = 0; set i = 0; set j = 0; set sv_dt = null; set dt = null; open myCursor; repeat fetch myCursor into dt; if sv_dt + 1 = dt then set i = i + 1; elseif sv_dt is null then set sv_dt = dt; set i = 1; set j = 1; else if i > j then set j = i; end if; set sv_dt = dt; set i = 1; end if; until done = 1 end repeat; close myCursor; return j; end; // delimiter ; select distinct id, consecutive_date(id) from tbl;

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なんか効率的なやりかたがありそうな気がしますが・・・ 冗長にロジックを考えてみました。 連続したデータということは・・・ (1)開始日と終了日がある→その差+1が連続した日付 (2)開始日と終了日の間におさまる日付の数が連続した日付 (3)(1)と(2)が合致するのが連続した日付であり、その最大値がIDごとの最大連続日 ただし命題に条件の付加が必要・・・IDとdateの組合せがユニークであること。 以下SQL CREATE TABLE `hoge`(`ID` int,`date` date, `point` int ,unique key(`ID`,`date`)); INSERT INTO `hoge` VALUES( 1,'2011-06-12',10),( 1,'2011-06-13',5 ),( 1,'2011-06-14',10),( 2,'2011-06-09',5 ),( 2,'2011-06-10',10),( 2,'2011-06-15',5 ),( 3,'2011-06-09',10),( 3,'2011-06-10',10),( 3,'2011-06-14',5 ),( 3,'2011-06-15',10),( 3,'2011-06-16',5 ); -- ここまでが初期設定 SELECT ID,MAX(DATEDIFF(d2,d1)+1) AS renzoku FROM ( SELECT T1.ID, T1.date as d1, T2.date as d2 FROM hoge AS T1 INNER JOIN hoge AS T2 ON T1.ID=T2.ID AND T1.date<T2.date ) AS SUB WHERE (SELECT COUNT(*) FROM hoge WHERE date BETWEEN d1 AND d2 and ID=SUB.ID ) =DATEDIFF(d2,d1)+1 GROUP BY ID

ran_fight
質問者

お礼

ありがとうございます。 なるほど1日違いの部分で最初と最後の日があるので、 その日数差の最大値が連続日数最大という考え方ですね。 自分のデータで試してみたいと思います。 やはり結構、複雑な形になるのですね。 冗長かもしれないということですので、解答欄は他の方法もあるのか少し空けておきます。

関連するQ&A

  • 連続したデータの最大日数を知りたい

    Excel2000を使用しています。 連続したデータ(値)の最大日数を調べたいのです。 たとえば・・・ A列に日付、B列にデータが入っているとします。 B列に1,1,1,1,2,2,1,1,3,・・・となっていて 1が連続した最大日数を求めたいのです。 上記の場合は4日ですので、4を求めたいのです。 この場合どういった関数を使って 計算をすればいいのでしょうか? もうひとつ、その最大日数が何月何日~何月何日に 発生したというのも、分かりますか? 分かりづらい説明で申し訳ありませんが よろしくお願いします。

  • MySQLでvarchar型のデータの最大値を取得する方法

    お世話になります。 どなたかご回答&アドバイスをよろしくお願い致します。 MySQLで、以下のように登録されているデータがあるとします。 ID(varchar) | name(varchar) 0000001 | ああああ 0000002 | いいいい 0000004 | ううううう それで、登録されているIDの最大値+1を取得したいのです。 IDのカラムのデータ型がIntならmaxで取得できると思うのですが、データ型がvarcharなので…。 レコードの数+1というのは、IDが必ずしも1から飛びがなく登録されているとは限らないので、 その方法は危ないのでできません。 上の例だと、「0000005」を取得したいです。 どうぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • MySQLでの時間データ加工

    MySQLで時間を加工する方法について教えてください。 例えば、時刻とidと連続する分を示すMySQLのテーブルがあった時に dates id interval 2015-02-13 22:57:30 1001 1 2015-02-14 07:02:10 1002 0 2015-02-14 09:12:22 1002 2 これを以下のように、連続する時間データに変換する方法がわかる方はいらっしゃいますか。 ※intervalは連続する分数を表します。 0の場合はそのまま、1以上の場合はその数だけdatesの「分」の所に+1ずつしていきたいです。 dates id 2015-02-13 22:57:30 1001  2015-02-13 22:58:30 1001 2015-02-14 07:02:10 1002 2015-02-14 09:12:22 1002 2015-02-14 09:13:22 1002 2015-02-14 09:14:22 1002 SQLに慣れておらず苦戦しております。。。 わかる方がいらっしゃいましたら、教えて頂けると有難いです。

    • ベストアンサー
    • MySQL
  • 連続したデータを条件とするSQL文の書き方

    下記のようなデータを扱っております。 ID | Point 1 | 10 2 | 20 3 | 30 4 | 20 5 | 30 6 | 10 7 | 20 8 | 30 9 | 30 上記データにおいて、Pointが10,20,30と連続している時の Pointが30でのID値を取得するSQL文が分かりません。 上記データであれば、ID3と8が条件に合致しており、取得したいID値となります。 ID5や9はPointが30ですが、『Pointが10,20,30と連続している』という条件に合致していない為、取得したいID値ではありません。 これを叶えるSQL文を教えて頂けないでしょうか。 (SQLiteを使用しています。)

  • MySQLのselect文で、最大ID値のデータを呼び出す

    MySQLのテーブルのフィールド名として「ID」を登録しています。(型はint) そこで、select文で最大ID値のデータを呼び出すにはどうすればいいのか教えて頂けないでしょうか? select * from tableA ?????;

    • ベストアンサー
    • MySQL
  • 3個の山になっている連続数値データから各最大値を

    エクセルで3個の山になっている連続数値データがあります。 0.3 2.5 5.8 7.6 3.5 0.2 3.0 6.2 7.9 4.5 0.1 2.7 5.2 7.3 3.3 0.3 といった具合です。 このデータはたとえのデータで、実際の連続データの行数は3000行くらいです。 今は、まずこのデータのグラフを描いて、そのグラフの山をみてから、該当するおよその行を選択して、MAX関数で最大値を3つ別々に求めています。 この方法以外にそれぞれの3つの山の最大値を得る便利な方法がありましたら教えてください。 よろしくお願いします。

  • mySQLをaccessから操作する方法

    xamppでmySQLを使用しています。 一行目にID、name、url、latestと書き、2行目以降は IDには整数。nameは文字列。urlはhttp://~、latestは2010/03/29形式の日付 が書かれたxlsx形式のデータがあります。 このデータをaccess2007でインポートして、mySQLとリンクさせるために一度終了させました。 http://www.hm-lab.net/archives/305 ここの指示に従い、インストールし、設定を Date Source Name=namae Server localhost のみ入力してOKをして、accessを再起動しました。 ここで先ほどのデータを読み込んだところ、IDとlatestに#Num!と表示されました。 この文字化け?は無視してもいいのでしょうか。 ここからmySQLに、データベースを作成する方法を教えてください。 どなたかよい方法があればご教示ください。どうかよろしくお願いします。

  • MySQLでデータが存在する日付を取得する方法

    MySQLで、DATETIME型のカラムから、指定した日数分の、データが存在する日付を取得することは可能でしょうか? 例えば、下記 table_a から最近3日分のデータが存在する日を取得したい場合、 2011-06-18 2011-06-16 2011-06-12 が最近3日のデータが存在する日なので、結果に示すようなものが取得したい内容となります。 (下記結果では、各日付けの最後の時刻が取得されていますが、時刻はどれでも構いません) もしそのようなことができるSQL構文がありましたら、ご教示ください。 よろしくお願いします。 (table_a) +---------------------+ | date | +---------------------+ | 2011-06-09 09:00:00 | +---------------------+ | 2011-06-09 15:00:00 | +---------------------+ | 2011-06-10 09:00:00 | +---------------------+ | 2011-06-11 09:00:00 | +---------------------+ | 2011-06-12 07:00:00 | +---------------------+ | 2011-06-12 09:00:00 | +---------------------+ | 2011-06-16 09:00:00 | +---------------------+ | 2011-06-18 09:00:00 | +---------------------+ | 2011-06-18 12:00:00 | +---------------------+ | 2011-06-18 20:00:00 | +---------------------+ (結果) +---------------------+ | date | +---------------------+ | 2011-06-18 20:00:00 | +---------------------+ | 2011-06-16 09:00:00 | +---------------------+ | 2011-06-12 09:00:00 | +---------------------+

    • ベストアンサー
    • MySQL
  • SQLで連続したカラムが何個あるかを求める方法

    お世話になっております。 PHPとmysqlでサイトを作っておりまして、そのログを分析しようとしています。 あるテーブルにユーザー名とログイン日付が入ったテーブルが有ったとして、その中で連続○日ログインしていた人は○人という結果を取りたいと考えているのですがこれをSQLで処理する方法はありますでしょうか? 今のところ、PHPで全データを取った後にPHP側で処理するしかないかと思っているのですが、件数が多いため可能であればmysql側で処理したいと思っています。 日付はUNIXTIMEに直すなどすればINTEGERに変換出来るとは思っているのですが、日付型(難しいようであればINT型の連続値でも問題ありません)でSQLで処理出来る方法はあるのでしょうか? ○○結合をすれば良いなど手がかりなど教えていただけると助かります。 ■テーブル username   login_date ほげ      2014/5/1 ほげ      2014/5/2 ほげ      2014/5/3 ほげ      2014/5/4 ふーばー   2014/5/2 ふーばー   2014/5/3 あああ     2014/5/1 あああ     2014/5/3 あああ     2014/5/4 ■ほしい結果 4日連続   1名 2日連続   2名

  • PHPサイトからMySQL内のデータを知る方法

    質問失礼いたします。 MySQLにあるデータベースをPHPサイトに表示しています。 PHPでは、 【datab.php】で、データベースへ接続し $link = mysql_connect('localhost', 'user', 'pass'); 【hyouji.php】にて、データを表示しています require_once("datab.php"); //SQL文 mysql_close($link); //データ配列 MySQL内のカラムには name , add , memo の3つがあり、PHPに表示させているのは name , add のみです。 しかし、どうやら memo にある内容が閲覧している人にわかったらしいのですが、 どこを見ても、memoの内容は表示されていません。 すみません、うまく言えないのですが… 上記にある【datab.php】の接続方法では、 MySQL内のデータがバレてしまうのでしょうか…? 原因も分からないのですが、何がお知恵をいただけたらと思います。 宜しくお願い致します。

    • ベストアンサー
    • MySQL