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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

4661閲覧

【Postgresql】同一グループ内の最大値を取得したviewの作成

kirby318

総合スコア10

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2018/04/17 04:28

編集2018/04/17 04:30

同一グループ内の最大値を取得したviewの作成を行いたいと思っています。
いろいろ調べて何度か実行してみたのですがうまくいかないため質問させていただきました。

sql

1table name => sample_tbl 2 id | group | date //最新 3----+-------+------------- 4 1 | A | 2018-04-13 * 5 2 | A | 2018-04-12 6 3 | B | 2018-04-11 7 4 | B | 2018-04-12 8 5 | B | 2018-04-17 * 9 6 | C | 2018-04-14 * 10 7 | C | 2018-04-12 11 8 | D | 2018-04-13 * 12 13table name => sample_tbl_2 14 id_2 | group | 15------+---------- 16 1 | A | 17 2 | B | 18 3 | C | 19 4 | D |

上記のような2つのテーブルがあるとします。
sample_tblの同一グループ(group)内で、最大の日付(date)のみ取得したいです。
以下のSQLを実行し、取得することができました。

sql

1SELECT * FROM sample_tbl 2WHERE date = ( 3 SELECT Max(date) 4 FROM sample_tbl t1 5 WHERE group = t1.group 6); 7 8// 実行結果 9 id | group | date //最新 10----+-------+------------- 11 1 | A | 2018-04-13 * 12 5 | B | 2018-04-17 * 13 6 | C | 2018-04-14 * 14 8 | D | 2018-04-13 *

このテーブルのgroupカラムは別テーブル「sample_tbl_2」と紐づいていて、
sample_tbl_2ではこのカラムはユニークになっています。

次に行いたいのがビューの作成なのですが、以下の3カラムを持たせたいです。

①sample_tbl_2.id_2 ②sample_tbl_2.group(sample_tbl.groupは多対一、sample_tbl_2はユニーク) ③同一のgroup内で、sample_tbl.dateの最新日付 // 期待値 ①sample_tbl_2.id_2 | ②sample_tbl_2.group | ③sample_tbl.date ---------------------+----------------------+------------------ 1 | A | 2018-04-13 2 | B | 2018-04-17 3 | C | 2018-04-14 4 | D | 2018-04-13

先ほどのsqlを組み合わせて以下のsqlを実行したところ、エラーが表示されました。

sql

1CREATE VIEW sample_view AS 2SELECT 3sample_tbl_2.id_2, 4sample_tbl_2.group, 5( 6 SELECT date FROM sample_tbl 7 WHERE date = ( 8 SELECT Max(date) 9 FROM sample_tbl t1 10 WHERE group = t1.group 11 ) 12) AS date 13FROM 14 sample_tbl_2 15 INNER JOIN 16 sample_tbl 17 ON 18 sample_tbl_2.group = sample_tbl.group; 19 20 21// エラー 22ERROR: more than one row returned by a subquery used as an expression

どのようにすれば期待通りの結果が得られるでしょうか。
ご教示くださいますようお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

sample_tbl_2のgroupと同じ値のsample_tblのdateの最大で良いんじゃないでしょうか。
(Viewにするほどでもない気がしますが、、)

SQL

1SELECT 2 sample_tbl_2.id_2, 3 sample_tbl_2.group, 4 ( 5 SELECT max(date) FROM sample_tbl 6 WHERE group = sample_tbl_2.group 7 ) AS date 8FROM 9 sample_tbl_2

投稿2018/04/17 07:13

編集2018/04/17 07:15
sazi

総合スコア25173

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

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

kirby318

2018/04/17 07:31

回答いただきありがとうございます。 期待通りとなりました。もっとシンプルでよかったのですね。 (実際はカラムの数がもっと多い形で使用します。) ありがとうございました。
guest

0

SQL

1SELECT Max(date) 2FROM sample_tbl t1 3WHERE group = t1.group 4

SQL

1SELECT Max(date) 2FROM sample_tbl t1 3WHERE group = t1.group 4GROUP BY group 5

と「GROUP BY group」を
追加してください。

PostgreSQL 7.3.4 チュートリアル
ttps://www.postgresql.jp/document/7.3/tutorial/tutorial-agg.html

投稿2018/04/17 04:54

kawakawa2018

総合スコア1195

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

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

kirby318

2018/04/17 06:17 編集

回答いただきありがとうございます。 試したところ、以下のエラーが表示されました。 ERROR: more than one row returned by a subquery used as an expression 複数列を単一行として扱うとでるエラーのようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問