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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

761閲覧

group by したデータの中で時間が近いもの同士の時差を求めたいです。

Hayato1201

総合スコア224

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/11/11 03:20

編集2021/11/11 03:23

下記の様なテーブルがあります。startは時間分秒の形式で例えば101503(10時15分03秒)の様になります。

例hogeテーブル

id | start |code
1 | 101503| 001
1 | 111801| 002
1 | 111604| 002
2 | 111504| 002
2 | 092604| 001
2 | 122604| 001
2 | 122603| 002

これに対して同じidでgroup by してstartが最大のものと最小のものの時差を求めるとしたら以下のようにすれば取得できました。(こちらの質問にて解決

sql

1select id 2 , extract(hour from diff_time) * 3600 3 + extract(minute from diff_time) * 60 4 + extract(second from diff_time) as diff_second 5from ( 6 select id 7 , max(to_timestamp(start, 'HH24MISS') 8 - min(to_timestamp(start, 'HH24MISS') as diff_time 9 from hoge 10 group by id 11) t

ただ、今回は最大のものと最小のものではなく
違うcode(001または002)同士で最も近い時間同士の時差を求めたいです。
同じIDに001,002の組み合わせが二つある場合はどちらの組み合わせの時差でも良いです。

例えば上記例のid 1 であれば 101503と111604の時差を求めたいです。id 2 であれば122603 と 122604の時差になります。

このような場合SQLでどうにか取得することは可能でしょうか?

お分かりになる方がいればご教示いただきたいです。

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

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

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

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

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

guest

回答1

0

以下のようなSQLになるかと思います。

SQL

1SELECT "id", MIN("diff") 2FROM ( 3 SELECT 4 H1."id", 5 ABS(EXTRACT(HOUR FROM TO_TIMESTAMP(H1."start", 'HH24MISS') - TO_TIMESTAMP(H2."start", 'HH24MISS')))*3600 6 + ABS(EXTRACT(MINUTE FROM TO_TIMESTAMP(H1."start", 'HH24MISS') - TO_TIMESTAMP(H2."start", 'HH24MISS')))*60 7 + ABS(EXTRACT(SECOND FROM TO_TIMESTAMP(H1."start", 'HH24MISS') - TO_TIMESTAMP(H2."start", 'HH24MISS'))) AS "diff" 8 FROM hoge H1 9 JOIN hoge H2 ON H1."id" = H2."id" AND H1."code" <> H2."code" 10) 11GROUP BY "id"

投稿2021/11/11 11:07

neko_the_shadow

総合スコア2273

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問