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

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

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

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

Q&A

解決済

2回答

1621閲覧

カラムに入っている数種類の値を最大値を条件に抽出し連結したい

Hayate_y

総合スコア7

PostgreSQL

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

0グッド

0クリップ

投稿2017/05/16 16:37

現在postgreSQLにてテーブルAのカラムAに入っている値をarray_agg関数で連結したものを、カラムcの値でorder byしテーブルBのカラムAへupdateで挿入するというSQLを作成しました。しかし、これでは連結した際の文字数がカラムのサイズを越えた場合エラーとなるため、カラムBの最大値を条件にカラムAの値を取り出そうとしているのですが、条件の設定が考え付きません。カラムBの各値は可変なので、変動します。
postgreSQLのバージョンは9.2.5です。
イメージは以下の通りです
tA
カラムA カラムB カラムC
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
A | 9 | a
A | 7 | a
A | 4 | a
A | 2 | a
B | 8 | a
B | 2 | a
B | 1 | a
B | 3 | a
C | 6 | a
C | 1 | a
C | 5 | b
A | 9 | b
A | 7 | b
A | 4 | b
A | 2 | b
B | 8 | b
B | 2 | b
B | 1 | b
B | 3 | b
C | 6 | b
C | 1 | b
C | 5 | b

現在
update tA set
カラムA = (select array_agg(カラムA) as カラムA from tB
where tA.カラムA = tB.カラムA order by tA.カラムC = tB.カラムC;
tB
カラムc|カラムA
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
a |{A,A,A,A,B,B,B,B,C,C,C}
b |{A,A,A,A,B,B,B,B,C,C,C}

↑これを
tB
カラムc|カラムA
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
a |{A,B,C}
b |{A,B,C}
↑こんな感じにしたい

ほぼ丸投げしてしまう形になってしまうのですが、よろしくお願いします。。。

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

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

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

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

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

guest

回答2

0

自己解決

distinctを用いることで解決しました

投稿2017/06/05 07:54

Hayate_y

総合スコア7

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

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

0

こんなん感じで作成してみました。

sql

1create temp table tblA 2(colA text, colB int, colC text); 3insert into tblA 4values 5('A',9,'a'), 6('A',7,'a'), 7('A',4,'a'), 8('A',2,'a'), 9('B',8,'a'), 10('B',2,'a'), 11('B',1,'a'), 12('B',3,'a'), 13('C',6,'a'), 14('C',1,'a'), 15('C',5,'b'), 16('A',9,'b'), 17('A',7,'b'), 18('A',4,'b'), 19('A',2,'b'), 20('B',8,'b'), 21('B',2,'b'), 22('B',1,'b'), 23('B',3,'b'), 24('C',6,'b'), 25('C',1,'b'), 26('C',5,'b'); 27 28create temp table tblB (colC text, colA text); 29insert into tblB values('a',''),('b',''); 30 31update tblB set colA=tC.colA FROM ( 32 select tA.colC, array_agg(tA.colA) colA from tblA tA 33 join (select colA, colC, max(colB) colB from tblA group by 1,2) tB 34 using (colA,colB,colC) 35 group by tA.colc) tc 36where tblB.colC=tC.colC; 37 38select * from tblB;

colc | cola
------+---------
a | {A,B,C}
b | {A,B,C}

投稿2017/05/17 09:16

A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問