回答編集履歴

2

追記2

2016/07/22 06:24

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -26,4 +26,76 @@
26
26
 
27
27
 
28
28
 
29
+ # 追記:新サンプル
29
30
 
31
+ とりあえずcolumn5はcolumn1に読み替えて回答します
32
+
33
+ ```SQL
34
+
35
+ CREATE TABLE table_name(column1 int,column3 int null,column4 int null);
36
+
37
+ INSERT INTO table_name VALUES(1,null,100),(1,200,null),(1,null,null),(2,100,300);
38
+
39
+ ```
40
+
41
+ 上記に対して
42
+
43
+ ```SQL
44
+
45
+ SELECT t1.column1,MAX(t2.column2) AS max_column2
46
+
47
+ FROM table_name AS t1
48
+
49
+ JOIN (SELECT COALESCE(column3, column4) AS column2,column1 FROM table_name) AS t2
50
+
51
+ ON t1.column1 = t2.column1
52
+
53
+ GROUP BY column1;
54
+
55
+ ```
56
+
57
+ を実行するなら、以下で十分です
58
+
59
+
60
+
61
+ ```SQL
62
+
63
+ SELECT column1,MAX(COALESCE(column3, column4)) AS max_column2
64
+
65
+ FROM table_name
66
+
67
+ GROUP BY column1
68
+
69
+ ```
70
+
71
+
72
+
73
+ サブクエリで自分自身を結合するのでよく使うのは
74
+
75
+ 特定のカラムの最大値を持つデータを表示するなど
76
+
77
+ サブクエリの中で集計が発生する場合です。
78
+
79
+
80
+
81
+ なお今回のCOALESCEの使い方ではcolumn3とcolumn4のどちらかにある最大値をとる
82
+
83
+ という仕様にはなっていません。なのでcolumn2_maxがもし上記条件を希望する場合は
84
+
85
+ 正確にデータを取ることができません。
86
+
87
+ column3が合致した時点でcolumn4を検証しないのでcolumn3<column4の場合データが拾えない
88
+
89
+ もしどちらか最大値をとりたいならこんな感じ
90
+
91
+
92
+
93
+ ```ここに言語を入力
94
+
95
+ SELECT column1,MAX(GREATEST(COALESCE(column3,0),COALESCE(column4,0))) AS max_column2
96
+
97
+ FROM table_name
98
+
99
+ GROUP BY column1;
100
+
101
+ ```

1

追記

2016/07/22 06:24

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -11,3 +11,19 @@
11
11
  ON t1.column1 = t2.column1;
12
12
 
13
13
  ```
14
+
15
+
16
+
17
+ # 追記:サンプルデータ
18
+
19
+ ```ここに言語を入力
20
+
21
+ CREATE TABLE table_name(column1 int,index(column1));
22
+
23
+ INSERT INTO table_name VALUES(1),(1),(2),(3),(3);
24
+
25
+ ```
26
+
27
+
28
+
29
+