質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

Q&A

解決済

3回答

5544閲覧

mysqlのデータの間引きをしたい

rtakar

総合スコア21

MySQL

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

0グッド

0クリップ

投稿2018/08/27 01:43

編集2018/08/27 01:59
uuidtimestumphogehogea
char型datetime型列3

という形になったmysql のDBがあります。
レコード数が多すぎるため
uuidごとの短時間にレコードが複数あった場合、間引きをしたいと考えてます

例えば

uuidtimestump
aaa2017-12-7 12:01:00
aaa2017-12-7 12:05:00
aaa2017-12-7 12:08:00
aaa2017-12-7 12:12:00
bbb2017-12-7 12:01:00

↓↓↓

uuidtimestump
aaa2017-12-7 12:01:00
aaa2017-12-7 12:12:00
bbb2017-12-7 12:01:00

のように10分間隔(できれば時間はこちらで変更できる)
で間引きしたいです。

データ数が多いためSQLで完結したいのでsql文の検討がつきません。
もしご存知の方がいらっしゃいましたらsql文での書き方をご教示ください。

追記

言葉が足りなかったため追記です。

00分10分20分以外のデータをデリートするのは無しでお願いします。
理由はユーザごとにレコード密度も違うデータで、かつ

uuidtimestump
aaa2017-12-7 12:01:00
aaa2017-12-7 12:05:00
aaa2017-12-7 12:08:00

このようなレコードだった場合全データの取得が出来ず偏りが出てしまうからです。

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

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

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

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

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

guest

回答3

0

既定分単位で切り上げ切り捨てしたデータ内を同一uuid列で検索して最も早い1件を取って一致させる
というやり方で可能かとは思います

が、正直件数が多すぎるとこれをする時間自体がかなり掛かる気がします。

sql

1create table test ( 2 tid char(3), 3 tm datetime, 4 hoge char(5), 5 dataid int 6); 7 8insert into test(tid,tm,dataid) 9select 'aaa', '2017-12-7 12:01:00',1; 10insert into test(tid,tm,dataid) 11select 'aaa', '2017-12-7 12:05:00',2; 12insert into test(tid,tm,dataid) 13select 'aaa', '2017-12-7 12:08:00',3; 14insert into test(tid,tm,dataid) 15select 'aaa', '2017-12-7 12:12:00',4; 16insert into test(tid,tm,dataid) 17select 'bbb', '2017-12-7 12:01:00',5; 18 19select * 20 /*,from_unixtime(truncate(unix_timestamp(tm) div (10 * 60),0) * (10 * 60)) 21 ,from_unixtime(truncate(unix_timestamp(tm+INTERVAL 10 MINUTE) div (10 * 60),0) * (10 * 60))*/ 22from test as A 23where A.dataid =( 24 select B.dataid 25 from test as B 26 where B.tid=A.tid 27 and B.tm >= from_unixtime(truncate(unix_timestamp(A.tm) div (10 * 60),0) * (10 * 60)) 28 and B.tm < from_unixtime(truncate(unix_timestamp(A.tm+INTERVAL 10 MINUTE) div (10 * 60),0) * (10 * 60)) 29 order by B.tm limit 1 30)

投稿2018/08/27 03:30

sousuke

総合スコア3828

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

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

0

ベストアンサー

こんな感じでしょうか?

SQL

1delete from テーブル where (uuid,timestump) in ( 2select * from( 3select uuid,timestump from テーブル as t1 where 4not exists 5( 6select timestump-interval date_format(timestump,"%i")%10 minute as m,uuid from テーブル 7group by m,tid 8having uuid=t1.uuid and min(timestump)=t1.timestump 9) 10) as dummy 11)

投稿2018/08/27 04:18

yambejp

総合スコア114769

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

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

rtakar

2018/08/28 07:25 編集

deleteはしたくなかったためプライマリーキーを追加して以下のように対応しました。参考になりました。ありがとうございます ```sql select * from( SELECT プライマリーキー FROM テーブル as t1 WHERE EXISTS( SELECT タイムスタンプカラム - INTERVAL date_format(タイムスタンプカラム,"%i")%10 MINUTE AS m, uuidカラム FROM テーブル GROUP BY m, uuidカラム HAVING uuidカラム=t1.uuidカラム AND MIN(タイムスタンプカラム)=t1.タイムスタンプカラム ) ) AS mabiki; ```
yambejp

2018/08/28 07:39

ああ、間引きというのでてっきりdeleteするものだと思いました 削除しないならもっと楽です select * from テーブル as t1 where exists ( select タイムスタンプカラム -interval date_format(タイムスタンプカラム ,"%i")%10 minute as m,tid from テーブル group by m,uuidカラム having uuidカラム=t1.uuidカラム and min(タイムスタンプカラム )=t1.タイムスタンプカラム )
guest

0

分秒が'00:00', '10:00', '20:00' ... '50:00'以外のデータはDELETEする。後はHAVING COUNT(*) > 1 でダブったデータがないか確認されては?

投稿2018/08/27 01:49

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問