回答編集履歴

2

回答を追記

2016/04/06 15:30

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -157,3 +157,221 @@
157
157
  ) AS l ON h.shop_id = l.shop_id AND h.head = l.head;
158
158
 
159
159
  ```
160
+
161
+
162
+
163
+ ---
164
+
165
+
166
+
167
+ いろいろ想像で補った部分がありますが、《結果01》を経由して《結果02》を得るためのSQLは、以下のようになります。
168
+
169
+ ```sql
170
+
171
+ # ④
172
+
173
+ SELECT
174
+
175
+ h.jan,
176
+
177
+ h.head AS price_type,
178
+
179
+ h.product_name_id AS max_product_name_id,
180
+
181
+
182
+
183
+ # ⑤
184
+
185
+ CASE l.product_name_id
186
+
187
+ WHEN h.product_name_id THEN 0
188
+
189
+ ELSE l.product_name_id
190
+
191
+ END AS min_product_name_id,
192
+
193
+
194
+
195
+ h.data AS price_max,
196
+
197
+
198
+
199
+ # ⑤
200
+
201
+ CASE l.data
202
+
203
+ WHEN h.data THEN 0
204
+
205
+ ELSE l.data
206
+
207
+ END AS price_min,
208
+
209
+
210
+
211
+ (h.data - l.data) AS price_diff
212
+
213
+ FROM (
214
+
215
+
216
+
217
+ # ②
218
+
219
+ SELECT main.*
220
+
221
+ FROM (
222
+
223
+
224
+
225
+ # ①
226
+
227
+ SELECT t1.*
228
+
229
+ FROM product_jans AS t1
230
+
231
+ LEFT JOIN product_jans AS t2 ON
232
+
233
+ t1.shop_id = t2.shop_id
234
+
235
+ AND t1.jan = t2.jan
236
+
237
+ AND t1.head = t2.head
238
+
239
+ AND t1.modified < t2.modified
240
+
241
+ WHERE t2.modified IS NULL
242
+
243
+
244
+
245
+ ) AS main
246
+
247
+ LEFT OUTER JOIN (
248
+
249
+
250
+
251
+ # ①
252
+
253
+ SELECT t1.*
254
+
255
+ FROM product_jans AS t1
256
+
257
+ LEFT JOIN product_jans AS t2 ON
258
+
259
+ t1.shop_id = t2.shop_id
260
+
261
+ AND t1.jan = t2.jan
262
+
263
+ AND t1.head = t2.head
264
+
265
+ AND t1.modified < t2.modified
266
+
267
+ WHERE t2.modified IS NULL
268
+
269
+
270
+
271
+ ) AS sub ON
272
+
273
+ main.jan = sub.jan
274
+
275
+ AND main.head = sub.head
276
+
277
+ AND main.data < sub.data
278
+
279
+ WHERE sub.data IS NULL
280
+
281
+
282
+
283
+ ) AS h
284
+
285
+ LEFT OUTER JOIN (
286
+
287
+
288
+
289
+ # ③
290
+
291
+ SELECT main.*
292
+
293
+ FROM (
294
+
295
+
296
+
297
+ # ①
298
+
299
+ SELECT t1.*
300
+
301
+ FROM product_jans AS t1
302
+
303
+ LEFT JOIN product_jans AS t2 ON
304
+
305
+ t1.shop_id = t2.shop_id
306
+
307
+ AND t1.jan = t2.jan
308
+
309
+ AND t1.head = t2.head
310
+
311
+ AND t1.modified < t2.modified
312
+
313
+ WHERE t2.modified IS NULL
314
+
315
+
316
+
317
+ ) AS main
318
+
319
+ LEFT OUTER JOIN (
320
+
321
+
322
+
323
+ # ①
324
+
325
+ SELECT t1.*
326
+
327
+ FROM product_jans AS t1
328
+
329
+ LEFT JOIN product_jans AS t2 ON
330
+
331
+ t1.shop_id = t2.shop_id
332
+
333
+ AND t1.jan = t2.jan
334
+
335
+ AND t1.head = t2.head
336
+
337
+ AND t1.modified < t2.modified
338
+
339
+ WHERE t2.modified IS NULL
340
+
341
+
342
+
343
+ ) AS sub ON
344
+
345
+ main.jan = sub.jan
346
+
347
+ AND main.head = sub.head
348
+
349
+ AND main.data > sub.data
350
+
351
+ WHERE sub.data IS NULL
352
+
353
+
354
+
355
+ ) AS l ON h.jan = l.jan AND h.head = l.head;
356
+
357
+ ```
358
+
359
+
360
+
361
+ 以下の条件で、データを抽出・整形しています。
362
+
363
+ 斜体字の部分が、私が想像で補った箇所です。
364
+
365
+ ① __jan、shop_id__、"新品・中古・コレクター"価格の組み合わせごとに`modified`が最新の行を抽出
366
+
367
+ ② ①の中から、__jan__、"新品・中古・コレクター"価格の組み合わせごとに最高値(`data`が最大)の行を抽出
368
+
369
+ ③ ①の中から、__jan__、"新品・中古・コレクター"価格の組み合わせごとに最安値(`data`が最小)の行を抽出
370
+
371
+ ④ ②、③を、__jan__、"新品・中古・コレクター"価格の組み合わせごとに1行に結合し、最高値と最安値、さらにそのそれぞれの商品名コード、価格差を取得
372
+
373
+ ⑤ その際、最高値と最安値が一致している行は最安値の商品名コードと価格を"0"と表示
374
+
375
+
376
+
377
+ なお、どこから出てきたか不明なため、《結果02》の`id`カラムは無視しています。

1

未完成の回答を追記

2016/04/06 15:30

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -37,3 +37,123 @@
37
37
  これが1秒でもズレることはないという認識で問題ないか、という意味です。
38
38
 
39
39
  この前提が誤っていると、そもそも《結果01》を取得するSQLから見直す必要があるかもしれません。
40
+
41
+
42
+
43
+ ---
44
+
45
+ ※まだ未完成です。うまく動きません。
46
+
47
+ ```sql
48
+
49
+ SELECT
50
+
51
+ h.jan,
52
+
53
+ h.product_name_id AS max_product_name_id,
54
+
55
+ l.product_name_id AS min_product_name_id,
56
+
57
+ h.data AS price_max,
58
+
59
+ l.data AS price_min,
60
+
61
+ (h.data - l.data) AS price_diff
62
+
63
+ FROM (
64
+
65
+
66
+
67
+ # ②
68
+
69
+ SELECT main.*
70
+
71
+ FROM product_jans AS main
72
+
73
+ LEFT OUTER JOIN (
74
+
75
+
76
+
77
+ # ①
78
+
79
+ SELECT t1.*
80
+
81
+ FROM product_jans AS t1
82
+
83
+ LEFT JOIN product_jans AS t2 ON
84
+
85
+ t1.shop_id = t2.shop_id
86
+
87
+ AND t1.product_name_id = t2.product_name_id
88
+
89
+ AND t1.head = t2.head
90
+
91
+ AND t1.modified < t2.modified
92
+
93
+ WHERE t2.modified IS NULL
94
+
95
+
96
+
97
+ ) AS sub ON
98
+
99
+ main.shop_id = sub.shop_id
100
+
101
+ AND main.head = sub.head
102
+
103
+ AND main.data < sub.data
104
+
105
+ WHERE sub.data IS NULL
106
+
107
+
108
+
109
+ ) AS h
110
+
111
+ LEFT OUTER JOIN (
112
+
113
+
114
+
115
+ # ③
116
+
117
+ SELECT main.*
118
+
119
+ FROM product_jans AS main
120
+
121
+ LEFT OUTER JOIN (
122
+
123
+
124
+
125
+ # ①
126
+
127
+ SELECT t1.product_name_id, t1.jan, t1.head, t1.data, t1.shop_id
128
+
129
+ FROM product_jans AS t1
130
+
131
+ LEFT JOIN product_jans AS t2 ON
132
+
133
+ t1.shop_id = t2.shop_id
134
+
135
+ AND t1.product_name_id = t2.product_name_id
136
+
137
+ AND t1.head = t2.head
138
+
139
+ AND t1.modified < t2.modified
140
+
141
+ WHERE t2.modified IS NULL
142
+
143
+
144
+
145
+ ) AS sub ON
146
+
147
+ main.shop_id = sub.shop_id
148
+
149
+ AND main.head = sub.head
150
+
151
+ AND main.data > sub.data
152
+
153
+ WHERE sub.data IS NULL
154
+
155
+
156
+
157
+ ) AS l ON h.shop_id = l.shop_id AND h.head = l.head;
158
+
159
+ ```