質問: ### 学歴情報を横に並べたい お世話になっております。 やりたいこととしましては、PostgreSQLで[表3]のようにユーザテーブルと 学歴テーブルを結合して学歴を行番号の降順で横に並べたいです。 以上、よろしくお願い致します。 ユーザテーブルのID、学歴テーブルのID、行番号はPKです。 **[表1]ユーザテーブル** | ID | ユーザ名 | 性別 | 生年月日 | | --- | --- | --- | --- | | 001 | 山田 | 男 | 1990/01/01 | | 002 | 鈴木 | 女 | 1992/03/31 | | 003 | 高橋 | 男 | 1980/02/21 | **[表2]学歴テーブル** | ID | 行番号 | 学校名 | 学部学科名 | 開始日 | 終了日 | | --- | --- | --- | --- | --- | --- | | 001 | 1 | A高校 | 普通科 | 2005/04/01 | 2008/03/31 | | 001 | 2 | B大学 | 経済学部経済学科 | 2009/04/01 | 2013/03/31 | | 001 | 3 | B大学院 | 経営マネジメント学科 | 2013/04/01 | 2015/03/31 | | 002 | 1 | Z高校 | 普通科 | 2008/04/01 | 2011/03/31 | | 002 | 2 | X大学 | 法学部法律学科 | 2011/04/01 | 2015/03/31 | | 003 | 1 | M高校 | 普通科 | 1995/04/01 | 1998/03/31 | | 003 | 2 | N大学 | 外国語学部英語学科 | 1998/04/01 | 2002/03/31 | **[表3]想定している結果** | ID | ユーザ名 | 性別 | 生年月日 | 学歴1:学校名 | 学歴1:学部学科名 | 学歴1:開始日 | 学歴1:終了日 | 学歴2:学校名 | 学歴2:学部学科名 | 学歴2:開始日 | 学歴2:終了日 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 001 | 山田 | 男 | 1990/01/01 | B大学院 | 経営マネジメント学科 | 2013/04/01 | 2015/03/31 | B大学 | 経済学部経済学科 | 2009/04/01 | 2013/03/31 | | 002 | 鈴木 | 女 | 1992/03/31 | X大学 | 法学部法律学科 | 2011/04/01 | 2015/03/31 | Z高校 | 普通科 | 2008/04/01 | 2011/03/31 | | 003 | 高橋 | 男 | 1980/02/21 | N大学 | 外国語学部英語学科 | 1998/04/01 | 2002/03/31 | M高校 | 普通科 | 1995/04/01 | 1998/03/31 | ### 試したこと 以下のサイトを見て直近の日付を抽出できることは理解できましたが、[表3]に示すような結果を抽出することができません。 SQL流行間比較(2) 直近,直近の1つ前,そのまた1つ前... ### 補足情報(FW/ツールのバージョンなど)
回答: できないことは無いですが行番号を最初から調整しないと集計列があわないですよね sample ======= postgreだと動かないかもしれませんが一応sample * 元データ ``` create table user (uid int unique,uname varchar(20),gender varchar(10),birth date); insert into user values (1,'山田','男','1990/01/01'), (2,'鈴木','女','1992/03/31'), (3,'高橋','男','1980/02/21'); create table gakureki (uid int,row int,gname varchar(20),gakka varchar(20),sdate date,edate date); insert into gakureki values (1,1,'A高校','普通科','2005/04/01','2008/03/31'), (1,2,'B大学','経済学部経済学科','2009/04/01','2013/03/31'), (1,3,'B大学院','経営マネジメント学科','2013/04/01','2015/03/31'), (2,1,'Z高校','普通科','2008/04/01','2011/03/31'), (2,2,'X大学','法学部法律学科','2011/04/01','2015/03/31'), (3,1,'M高校','普通科','1995/04/01','1998/03/31'), (3,2,'N大学','外国語学部英語学科','1998/04/01','2002/03/31'); ``` * 集計 ``` select * from (select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=1) as t1 left join (select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=2) as t2 on t1.uid=t2.uid left join (select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=3) as t3 on t1.uid=t3.uid ```