回答編集履歴

6

追記

2021/10/01 23:51

投稿

takanaweb5
takanaweb5

スコア359

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

別解の提示

2021/10/01 23:51

投稿

takanaweb5
takanaweb5

スコア359

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

見た目

2021/10/01 12:22

投稿

takanaweb5
takanaweb5

スコア359

test CHANGED
@@ -78,11 +78,11 @@
78
78
 
79
79
  | ------ | ---------- | -------- | -------- | -------- |
80
80
 
81
- | 1 | 2021/09/15 | 161 | 55 | 21.22 |
81
+ | 1 | 2021/09/15 | 161 | 55 | 21.22|
82
82
 
83
- | 2 | 2021/07/18 | 188 | 88 | 24.9 |
83
+ | 2 | 2021/07/18 | 188 | 88 | 24.9 |
84
84
 
85
- | 3 | 2021/09/15 | 155 | « NULL » | « NULL » |
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 | 2021/09/01 | 160 | 55 | 21.48 | 2021-09-15 | 2021/09/15 |
107
+ | 1 | 2021/09/01 | 160 | 55 | 21.48 | 2021-09-15 | 2021/09/15 |
108
108
 
109
- | 1 | 2021/09/09 | « NULL » | 56 | « NULL » | 2021-09-15 | 2021/09/15 |
109
+ | 1 | 2021/09/09 | NULL| 56 | NULL | 2021-09-15 | 2021/09/15 |
110
110
 
111
- | 1 | 2021/09/15 | 161 | 55 | 21.22 | 2021-09-15 | 2021/09/15 |
111
+ | 1 | 2021/09/15 | 161 | 55 | 21.22 | 2021-09-15 | 2021/09/15 |
112
112
 
113
- | 2 | 2021/07/18 | 188 | 88 | 24.9 | 2021-07-18 | 2021/09/15 |
113
+ | 2 | 2021/07/18 | 188 | 88 | 24.9 | 2021-07-18 | 2021/09/15 |
114
114
 
115
- | 2 | 2021/09/15 | 189 | « NULL » | « NULL » | 2021-07-18 | 2021/09/15 |
115
+ | 2 | 2021/09/15 | 189 | NULL | NULL | 2021-07-18 | 2021/09/15 |
116
116
 
117
- | 3 | 2021/08/08 | « NULL » | « NULL » | « NULL » | « NULL » | 2021/09/15 |
117
+ | 3 | 2021/08/08 | NULL| NULL | NULL | NULL | 2021/09/15 |
118
118
 
119
- | 3 | 2021/09/15 | 155 | « NULL » | « NULL » | « NULL » | 2021/09/15 |
119
+ | 3 | 2021/09/15 | 155 | NULL | NULL | NULL | 2021/09/15 |

3

IFNULL -> COALESCE

2021/09/30 14:07

投稿

takanaweb5
takanaweb5

スコア359

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  -- 対象のレコードがない場合は、入力の計測日以前の最大の日付のレコードを返す
72
72
 
73
- WHERE 計測日 = IFNULL(直前計測日,最大日)
73
+ WHERE 計測日 = COALESCE(直前計測日,最大日)
74
74
 
75
75
  ```
76
76
 

2

追記

2021/09/30 13:34

投稿

takanaweb5
takanaweb5

スコア359

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

追記

2021/09/30 12:31

投稿

takanaweb5
takanaweb5

スコア359

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
  参考までにサブクエリの実行結果は以下の通り