teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

sample

2018/06/18 14:07

投稿

yambejp
yambejp

スコア117936

answer CHANGED
@@ -1,1 +1,33 @@
1
- できないことは無いですが行番号を最初から調整しないと集計列があわないですよね
1
+ できないことは無いですが行番号を最初から調整しないと集計列があわないですよね
2
+
3
+ # sample
4
+ postgreだと動かないかもしれませんが一応sample
5
+
6
+
7
+ - 元データ
8
+ ```SQL
9
+ create table user (uid int unique,uname varchar(20),gender varchar(10),birth date);
10
+ insert into user values
11
+ (1,'山田','男','1990/01/01'),
12
+ (2,'鈴木','女','1992/03/31'),
13
+ (3,'高橋','男','1980/02/21');
14
+
15
+ create table gakureki (uid int,row int,gname varchar(20),gakka varchar(20),sdate date,edate date);
16
+ insert into gakureki values
17
+ (1,1,'A高校','普通科','2005/04/01','2008/03/31'),
18
+ (1,2,'B大学','経済学部経済学科','2009/04/01','2013/03/31'),
19
+ (1,3,'B大学院','経営マネジメント学科','2013/04/01','2015/03/31'),
20
+ (2,1,'Z高校','普通科','2008/04/01','2011/03/31'),
21
+ (2,2,'X大学','法学部法律学科','2011/04/01','2015/03/31'),
22
+ (3,1,'M高校','普通科','1995/04/01','1998/03/31'),
23
+ (3,2,'N大学','外国語学部英語学科','1998/04/01','2002/03/31');
24
+ ```
25
+
26
+ - 集計
27
+ ```SQL
28
+ select * from
29
+ (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
30
+ 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
31
+ 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
32
+
33
+ ```