回答編集履歴

1

追記

2017/11/14 13:07

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -1,3 +1,93 @@
1
1
  初心者にはちょっと厳しいかと思いますが、先日質問があがった
2
2
 
3
3
  [結合したテーブルの取得結果が複数件存在した場合に1件として扱えますか。](https://teratail.com/questions/99914)の回答を利用すれば可能です
4
+
5
+
6
+
7
+ # 追記
8
+
9
+ 前回提示したとおりSQLを以下組み立てればできそうですが・・・
10
+
11
+
12
+
13
+ - 元データ作成
14
+
15
+
16
+
17
+ 必ず順位付けができるようにidを振ってあります。
18
+
19
+ 時系列で処理するなら更新日時などを利用してもよいでしょう。
20
+
21
+ ただし同値で同順位になるようだと問題です
22
+
23
+
24
+
25
+ ```SQL
26
+
27
+ create table tbl(id int unique,sess int,val varchar(10));
28
+
29
+ insert into tbl values
30
+
31
+ (1,1,'A'),
32
+
33
+ (2,1,'B'),
34
+
35
+ (3,2,'A'),
36
+
37
+ (4,2,'C'),
38
+
39
+ (5,2,'D'),
40
+
41
+ (6,3,'A'),
42
+
43
+ (7,3,'C'),
44
+
45
+ (8,3,'E'),
46
+
47
+ (9,3,'F'),
48
+
49
+ (10,3,'G'),
50
+
51
+ (11,4,'D'),
52
+
53
+ (12,5,'C'),
54
+
55
+ (13,5,'D');
56
+
57
+ ```
58
+
59
+
60
+
61
+ - 検索
62
+
63
+ ```SQL
64
+
65
+ select sess
66
+
67
+ ,group_concat(case rank when 1 then val end) as val1
68
+
69
+ ,group_concat(case rank when 2 then val end) as val2
70
+
71
+ ,group_concat(case rank when 3 then val end) as val3
72
+
73
+ ,group_concat(case rank when 4 then val end) as val4
74
+
75
+ ,group_concat(case rank when 5 then val end) as val5
76
+
77
+ from(
78
+
79
+ select id,sess,val,(select count(*)+1 from tbl as t2 where t1.sess=t2.sess and t1.id>t2.id) as rank
80
+
81
+ from tbl t1
82
+
83
+ ) as b
84
+
85
+ group by sess
86
+
87
+ ```
88
+
89
+
90
+
91
+ 上記をいちいちgroup_concatを書くのが面倒でしたら
92
+
93
+ 参考につけたprocedureで処理します。