質問するログイン新規登録
MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

797閲覧

MySQLで連続した行を集計するSQL

yuko0524

総合スコア28

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2022/03/31 09:59

編集2022/03/31 10:18

0

0

MySQLで、連続したデータを集計する方法についてです。
以下のようなテーブルがあるとすると、

epoc_secsensor_id
16282367110
16282367122
16282367132
16282367142
16282367152
16282367161
16282367171
16282367181
16282367191

area_idの件数をまとめたいです。
理想の結果としては、

epoc_secsensor_idcount
162823671101
162823671224
162823671614

上記のようにしたいのですが、
(※epoc_secは最初に見つかった値とします。)
色々調べてみたところ旅人算メソッドというものがヒットしたのですが、
内容を確認してもピンと来ず、試行錯誤中です。

SQL

1select p2.epoch_sec, min(p2.sensor_id) , max(p2.sensor_id) ,count(*) 2from (select p1.epoch_sec, p1.sensor_id, 3 Row_Number() over(order by p1.epoch_sec) 4 -Row_Number() over(order by p1.epoch_sec) 5 as buff 6 from persons p1 7 ) p2 8group by buff 9order by min(p2.epoch_sec);

MySQL8.0です。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

誤字?が多い…area_idなのかsensor_idなのか、epoch_secなのかepoc_secなのか…

旅人算メソッドというのは「連続した番号から連番を減算すると一定値になる」ことを
利用したグループ化の手段だと思います。名前は初めて聞きましたがやってることを見るとそういうことかと。

SQL

1select p1.epoc_sec, p1.area_id 2 ,Row_Number() over(partition by p1.area_id order by p1.epoc_sec) rn 3 ,p1.epoc_sec-Row_Number() over(partition by p1.area_id order by p1.epoc_sec)+1 as buff 4from tbl p1

↑これをグループ化やカウントすれば目的にたどり着けます。

SQL

1select min(epoc_sec) as epoc_sec,area_id,count(*),buff 2from ( 3select p1.epoc_sec, p1.area_id 4 ,Row_Number() over(partition by p1.area_id order by p1.epoc_sec) rn 5 ,p1.epoc_sec-Row_Number() over(partition by p1.area_id order by p1.epoc_sec)+1 as buff 6from tbl p1 7) p2 8group by area_id,buff 9order by buff,area_id

投稿2022/04/01 01:46

sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuko0524

2022/04/01 07:17

誤字の件、色々やっていた途中のSQLを貼り付けてしまったので、よろしくない状態でした。 ご指摘ありがとうございます。 また本題ですが、意図していた結果を返すことが概ね達成することができ、感謝申し上げます。 大変助かりました!!!
guest

0

アバウトです

SQL

1create table tbl(epoc_sec int primary key,area_id int); 2insert into tbl values 3(1628236711,0), 4(1628236712,2), 5(1628236713,2), 6(1628236714,2), 7(1628236715,2), 8(1628236716,1), 9(1628236717,1), 10(1628236718,1), 11(1628236719,1);

集計

SQL

1set @a:=-999,@b:=-999; -- 適当な初期値 2select epoc_sec,max(area_id ),count(*) from ( 3select case @b when area_id then @a else @a:=epoc_sec end as epoc_sec,@b:=area_id as area_id 4from tbl 5order by epoc_sec 6) as dummy 7group by epoc_sec

投稿2022/03/31 11:07

yambejp

総合スコア117967

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuko0524

2022/04/01 00:32

ありがとうございます。 申し訳ありませんが確認させてください。 先頭行のsetで設定する初期値というのはどのような役割をしているのでしょうか。
yambejp

2022/04/01 01:33

変数の初期値を設定しないで比較するとおかしな挙動になります set構文を書きたくないなら無理やりこんな感じでも処理できます select epoc_sec,max(area_id ),count(*) from ( select case (select @b from (select @b:=-999) as dummy) when area_id then (select @a from (select @a:=-999) as dummy) else @a:=epoc_sec end as epoc_sec,@b:=area_id as area_id from tbl order by epoc_sec ) as dummy group by epoc_sec
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問