回答編集履歴
6
追記
test
CHANGED
@@ -124,7 +124,7 @@
|
|
124
124
|
|
125
125
|
追記:
|
126
126
|
|
127
|
-
@mayu- さんのアイデアを応用すれば、サブクエリなしのSQLでも実現可能です。
|
127
|
+
@sousuke さんや @mayu- さんのアイデアを応用すれば、サブクエリなしのSQLでも実現可能です。
|
128
128
|
|
129
129
|
```SQL
|
130
130
|
|
5
別解の提示
test
CHANGED
@@ -117,3 +117,35 @@
|
|
117
117
|
| 3 | 2021/08/08 | NULL| NULL | NULL | NULL | 2021/09/15 |
|
118
118
|
|
119
119
|
| 3 | 2021/09/15 | 155 | NULL | NULL | NULL | 2021/09/15 |
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
追記:
|
126
|
+
|
127
|
+
@mayu- さんのアイデアを応用すれば、サブクエリなしのSQLでも実現可能です。
|
128
|
+
|
129
|
+
```SQL
|
130
|
+
|
131
|
+
SELECT DISTINCT
|
132
|
+
|
133
|
+
ID
|
134
|
+
|
135
|
+
-- BMIが設定されている行を優先して、計測日の昇順にソートした最後の行の値(=降順にソートした最初の行)を取得します
|
136
|
+
|
137
|
+
-- 単純に昇順にソートしてLAST_VALUE()を使用しても意図した結果が得られないので、トリッキーな方法を使用しています
|
138
|
+
|
139
|
+
, FIRST_VALUE(身長) OVER W AS 身長
|
140
|
+
|
141
|
+
, FIRST_VALUE(体重) OVER W AS 体重
|
142
|
+
|
143
|
+
, FIRST_VALUE(BMI) OVER W AS BMI
|
144
|
+
|
145
|
+
FROM ZZZ
|
146
|
+
|
147
|
+
WINDOW W AS (PARTITION BY ID ORDER BY (BMI IS NULL), 計測日 DESC)
|
148
|
+
|
149
|
+
ORDER BY ID
|
150
|
+
|
151
|
+
```
|
4
見た目
test
CHANGED
@@ -78,11 +78,11 @@
|
|
78
78
|
|
79
79
|
| ------ | ---------- | -------- | -------- | -------- |
|
80
80
|
|
81
|
-
| 1
|
81
|
+
| 1 | 2021/09/15 | 161 | 55 | 21.22|
|
82
82
|
|
83
|
-
| 2
|
83
|
+
| 2 | 2021/07/18 | 188 | 88 | 24.9 |
|
84
84
|
|
85
|
-
| 3
|
85
|
+
| 3 | 2021/09/15 | 155 | NULL | NULL |
|
86
86
|
|
87
87
|
|
88
88
|
|
@@ -104,16 +104,16 @@
|
|
104
104
|
|
105
105
|
| ------ | ---------- | -------- | -------- | -------- | -------------- | ---------- |
|
106
106
|
|
107
|
-
| 1
|
107
|
+
| 1 | 2021/09/01 | 160 | 55 | 21.48 | 2021-09-15 | 2021/09/15 |
|
108
108
|
|
109
|
-
| 1
|
109
|
+
| 1 | 2021/09/09 | NULL| 56 | NULL | 2021-09-15 | 2021/09/15 |
|
110
110
|
|
111
|
-
| 1
|
111
|
+
| 1 | 2021/09/15 | 161 | 55 | 21.22 | 2021-09-15 | 2021/09/15 |
|
112
112
|
|
113
|
-
| 2
|
113
|
+
| 2 | 2021/07/18 | 188 | 88 | 24.9 | 2021-07-18 | 2021/09/15 |
|
114
114
|
|
115
|
-
| 2
|
115
|
+
| 2 | 2021/09/15 | 189 | NULL | NULL | 2021-07-18 | 2021/09/15 |
|
116
116
|
|
117
|
-
| 3
|
117
|
+
| 3 | 2021/08/08 | NULL| NULL | NULL | NULL | 2021/09/15 |
|
118
118
|
|
119
|
-
| 3
|
119
|
+
| 3 | 2021/09/15 | 155 | NULL | NULL | NULL | 2021/09/15 |
|
3
IFNULL -> COALESCE
test
CHANGED
@@ -70,7 +70,7 @@
|
|
70
70
|
|
71
71
|
-- 対象のレコードがない場合は、入力の計測日以前の最大の日付のレコードを返す
|
72
72
|
|
73
|
-
WHERE 計測日 =
|
73
|
+
WHERE 計測日 = COALESCE(直前計測日,最大日)
|
74
74
|
|
75
75
|
```
|
76
76
|
|
2
追記
test
CHANGED
@@ -33,6 +33,8 @@
|
|
33
33
|
(003, '2021-09-15', 155, NULL, NULL);
|
34
34
|
|
35
35
|
```
|
36
|
+
|
37
|
+
WINDOW関数を使用した例を紹介します。
|
36
38
|
|
37
39
|
|
38
40
|
|
1
追記
test
CHANGED
@@ -72,6 +72,18 @@
|
|
72
72
|
|
73
73
|
```
|
74
74
|
|
75
|
+
| **ID** | **計測日** | **身長** | **体重** | **BMI** |
|
76
|
+
|
77
|
+
| ------ | ---------- | -------- | -------- | -------- |
|
78
|
+
|
79
|
+
| 1 | 2021/09/15 | 161 | 55 | 21.22 |
|
80
|
+
|
81
|
+
| 2 | 2021/07/18 | 188 | 88 | 24.9 |
|
82
|
+
|
83
|
+
| 3 | 2021/09/15 | 155 | « NULL » | « NULL » |
|
84
|
+
|
85
|
+
|
86
|
+
|
75
87
|
|
76
88
|
|
77
89
|
参考までにサブクエリの実行結果は以下の通り
|