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

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

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

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

Q&A

3回答

264閲覧

重複したレコードがある際に優先度の高いレコード1つを抽出するSQLの条件を教えてください。

mimiq

総合スコア0

SQL

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

0グッド

0クリップ

投稿2025/05/12 06:59

編集2025/05/12 07:21

重複したデータがある場合、優先度の高い(a>b>c>d)データを取得したいです。カラム1のデータを取得するまでのSQLはできているとして、カラム1の値が同一のデータが複数ある場合に、優先度が最も高い1レコードに絞る追加の条件を教えていただきたいです。
オラクルを使用しています。

【例1】
カラム1| 優先度
aaa | a
aaa | b
aaa | c
aaa | d
bbb | b
bbb | c
bbb | d

取得結果
カラム1| 優先度
aaa | a
bbb | b

【例2】
カラム1| 優先度
aaa | a
aaa | c
bbb | b
bbb | c
ccc | c
ccc | d

取得結果
カラム1| 優先度
aaa | a
bbb | b
bbb | c

【例3】
カラム1| 優先度
aaa | c
aaa | d
bbb | b
bbb | d
ccc | a
ccc | d

取得結果
カラム1| 優先度
aaa | c
bbb | b
ccc | a

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

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

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

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

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

YAmaGNZ

2025/05/12 07:09

データベースな何なのでしょうか?
mimiq

2025/05/12 07:21

オラクルを使用しています。
guest

回答3

0

単純に、ORDER BY 優先度 LIMIT 1のような形で問題ないかと思います。

それではまずい背景などはありますか?

投稿2025/05/12 07:03

maisumakun

総合スコア146557

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

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

mimiq

2025/05/12 07:11

回答していただきありがとうございます。 補足できていなかったのですが、実際使用したいSQLの取得結果は複数件ある(例でいうとカラム1がbbbやcccのレコードも取得している)ため、LIMITで行数指定ではなく、他の方法を探していました。
yambejp

2025/05/12 07:13

mimiqさん もう少しサンプル数を増やしてどういう結果がほしいか明示ください
mimiq

2025/05/12 07:23

yambejpさん ご指摘ありがとうございます。 サンプルをわかりやすく修正させていただきました。 よろしければご確認していただけると幸いです。
maisumakun

2025/05/12 07:49

GROUP BY カラム1でMIN(優先度)を取る、というような方法も考えられます。 (この2列以外に必要なデータはないのでしょうか)
guest

0

共通表式(CTE)を利用して、a、b、c、d といった優先度を、それぞれ 1、2、3、4 に変換する方法が適切かと思います。

SQL

1WITH R (priority, rank) AS ( 2 SELECT 'a', 1 FROM DUAL 3 UNION ALL SELECT 'b', 2 FROM DUAL 4 UNION ALL SELECT 'c', 3 FROM DUAL 5 UNION ALL SELECT 'd', 4 FROM DUAL 6) 7SELECT 8 E.column1, 9 ANY_VALUE(E.priority) KEEP (DENSE_RANK FIRST ORDER BY R.rank) priority 10FROM example_table E 11JOIN R ON E.priority = R.priority 12GROUP BY E.column1

あるいはINSTRを使って変換する方法も考えられます。

SQL

1SELECT 2 column1, 3 ANY_VALUE(priority) KEEP (DENSE_RANK FIRST ORDER BY INSTR('abcd', priority)) priority 4FROM example_table 5GROUP BY column1

※ 以下のDDLを利用し、Oracle Database 21c で稼働確認しました。

SQL

1CREATE TABLE example_table ( 2 column1 VARCHAR(10), 3 priority CHAR(1) 4); 5 6-- 例1 7INSERT INTO example_table (column1, priority) VALUES ('aaa', 'a'); 8INSERT INTO example_table (column1, priority) VALUES ('aaa', 'b'); 9INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c'); 10INSERT INTO example_table (column1, priority) VALUES ('aaa', 'd'); 11INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b'); 12INSERT INTO example_table (column1, priority) VALUES ('bbb', 'c'); 13INSERT INTO example_table (column1, priority) VALUES ('bbb', 'd'); 14 15-- 例2 16INSERT INTO example_table (column1, priority) VALUES ('aaa', 'a'); 17INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c'); 18INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b'); 19INSERT INTO example_table (column1, priority) VALUES ('bbb', 'c'); 20INSERT INTO example_table (column1, priority) VALUES ('ccc', 'c'); 21INSERT INTO example_table (column1, priority) VALUES ('ccc', 'd'); 22 23-- 例3 24INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c'); 25INSERT INTO example_table (column1, priority) VALUES ('aaa', 'd'); 26INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b'); 27INSERT INTO example_table (column1, priority) VALUES ('bbb', 'd'); 28INSERT INTO example_table (column1, priority) VALUES ('ccc', 'a'); 29INSERT INTO example_table (column1, priority) VALUES ('ccc', 'd');

投稿2025/05/12 09:21

編集2025/05/12 09:22
neko_the_shadow

総合スコア2379

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

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

0

優先度を文字で行うのは非効率的です。今回はたまたまa,b,c,dという文字列の出現順だからよいですが、たとえば「S」的な特別な優先度がでてきたときにorder byの方法がめんどくさくなります。数値で指定すれば@maisumakunさんの方法がベストで、気になるならgroup byしてminをとってもよいでしょう

投稿2025/05/12 07:10

編集2025/05/12 07:12
yambejp

総合スコア117691

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

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

mimiq

2025/05/12 07:26 編集

回答ありがとうございます。元々ある文字列のカラムに今回優先度をつけて取得するSQLを作りたかったので、group byしてminなどが使用できず悩んでいました。
yambejp

2025/05/12 09:18

改めたデータをみるとgroup by + minがベストですね a,b,c,d順であればminで十分です。 そうでなく特殊な優先順位があるなら具体的なロジックを提示いただく必要があります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問