teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

解決済

1回答

220閲覧

次レコードにある座標データを使って2点間の距離を計算したい

yuko0524

総合スコア28

MySQL

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

0グッド

0クリップ

投稿2023/08/23 06:59

0

0

実現したいこと

person_idの座標データを書き込むテーブル(T_log)があります。
位置情報としてx座標(pos_x)、y座標(pos_y)があり、
それを使って時間経過に伴う移動距離を計算したいです。

【最終の出力イメージ】(person_idごとに距離を積算)
person_id , 距離(m)
1111 , 1.6
2222 , 10.1
3333 , 15

前提

次のようなサンプルデータがあるとします。
date_time , person_id , pos_x , pos_y
2023/5/15 8:30:02 , 1111 ,38 , 10
2023/5/15 8:40:02 , 1111 ,36 , 8
2023/5/15 8:30:07 , 2222 ,36 , 8
2023/5/15 8:30:12 , 3333 ,36 , 8
2023/5/15 8:50:17 , 3333 ,36 , 10
2023/5/15 8:50:22 , 1111 ,36 , 8
2023/5/15 8:55:27 , 3333 ,30 , 8
2023/5/15 8:55:32 , 3333 ,28 , 8
2023/5/15 8:55:37 , 3333 ,20 , 10
2023/5/15 9:00:11 , 2222 ,28 , 10
2023/5/15 9:05:11 , 2222 ,28 , 10
2023/5/15 9:20:11 , 3333 ,18 , 8

window関数を使って、person_idごとに、
1件目のpos_x,pos_yと2件目のpos_x,pos_yで、2点間の距離を計算。
以下同様に、
2件目pos_x,pos_yと3件目pos_x,pos_yを使って距離計算、
3件目pos_x,pos_yと4件目pos_x,pos_yを使って距離計算、、、、

そして以下のようなデータで出力させたいです。
person_id , date_time , pos_x , pos_y , distance
1111 ,2023/5/15 8:40:02 , 1.6
1111, 2023/5/15 8:50:22 , 0
2222 ,2023/5/15 9:00:11 , 2.1
2222 ,2023/5/15 9:05:11 , 0
3333 ,2023/5/15 8:50:17 , 2
3333 ,2023/5/15 8:55:27 , 6
3333 ,2023/5/15 8:55:32 , 2
3333 ,2023/5/15 8:55:37 , 2.1
3333 ,2023/5/15 9:20:11 , 2.87
※計算が間違っているかもしれませんが、
あくまで出力イメージになります。

ここまでできればperson_idをグループ化して、
distanceの合計を出せそうに思っております。

私のSQL文ではエラーになるようで、結果が返ってきません・・・。

発生している問題・エラーメッセージ

エラーメッセージ Error Code: 1690. BIGINT UNSIGNED value is out of range in '(((`lead(pos_x) OVER (PARTITION BY person_id ORDER BY date_time ) ` - pos_x`) ^ 2) + ((`lead(pos_y) OVER (PARTITION BY person_id ORDER BY date_time) ` - `pos_y`) ^ 2))' ### 該当のソースコード ```SQL SELECT date_time ,person_id ,pos_x ,pos_y ,sqrt( ((LEAD(pos_x) OVER (Partition by person_id ORDER BY date_time))-pos_x)^2 + ((LEAD(pos_y) OVER (Partition by person_id ORDER BY date_time))-pos_y)^2 ) AS distance FROM T_log

試したこと

Window関数を使ったことと、
2点間の距離計算の公式を使いました。
SQRT( (x2-x1)^2 + (y2-y1) ^2 )

補足情報(FW/ツールのバージョンなど)

MySQL version: 8.0.31

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

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

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

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

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

guest

回答1

0

ベストアンサー

べき乗の計算にPOW関数を利用されるとよいかと思います (MySQLでは^はXORの意味)

SQL

1SELECT 2 date_time, person_id, pos_x, pos_y, 3 SQRT( 4 POW((pos_x - LAG(pos_x) OVER (PARTITION BY person_id ORDER BY date_time)), 2) 5 + POW((pos_y - LAG(pos_y) OVER (PARTITION BY person_id ORDER BY date_time)), 2) 6 ) AS distance 7FROM T_log;

投稿2023/08/23 07:26

neko_the_shadow

総合スコア2395

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

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

yuko0524

2023/08/23 07:31

速やかなご回答ありがとうございます。 POW関数で即、解決いたしました!本当に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問