SQL来选择一个值的倍数



我需要生成一个烛光图,并需要转换此表

amount  created_at              updated_at
258     2019-10-17 01:45:17     2019-10-17 01:45:17
186     2019-10-17 01:45:17     2019-10-17 01:45:17
122     2019-10-17 01:46:31     2019-10-17 01:46:31
092     2019-10-17 01:46:31     2019-10-17 01:46:31
086     2019-10-17 01:47:47     2019-10-17 01:47:47
172     2019-10-17 01:47:47     2019-10-17 01:47:47

到下面的json对象

[
{ time: '2019-10-17 01:45:17', open: 180, high: 180, low: 178, close: 179 },
{ time: '2019-10-17 01:46:17', open: 180, high: 181, low: 177, close: 178 },
{ time: '2019-10-17 01:47:17', open: 175, high: 179, low: 175, close: 178 },
]

我是用PHP编写的,不介意有一个可以做同样事情的PHP代码。请注意,从表中的第一条记录开始,每个时间间隔为5分钟。

编辑:生成的json值包括从updated_at列获得的time、从该间隔的数量获得的第一个数据open、该间隔的最高数量high、该间隔最低数量low,最后是该间隔的最后一个数据close。在只有一个数据的情况下,应将其用作开、关、高和低。本图中的所有json值都是任意数字。

我尝试在PHP中使用strtotime()将每个时间戳转换为unix时间戳,然后循环遍历这些值,如果满足以下条件,则将数量推送到数组中。

$tnow = 0;
$time = 60;
$interval = 0;
$y = [];
$z = [];
$array = [];
foreach ($db as $key => $value) {
if($key == 0){
$tnow = strtotime($value['updated_at']);
}
if(strtotime($value['updated_at']) <= $tnow){
array_push($z, $value['amount']);
}
else{
$array = sort($z);
$cc = count($z)-1;
array_push($z, $z[0]);
array_push($z, $array[$cc]);
array_push($z, $array[0]);
array_push($z, $z[$cc]);
array_push($y, $z);
$z = [];
$tnow = ($tnow+60);
continue;
}
}

如果我能用JavaScript更好地实现这一点,我一点也不介意。

通过按时间对数据进行排序,您可以按分钟分组(只需取ISO字符串的一部分(,并将第一个值用作open,将每个值用作end值。为了得到高值和低值,你可以取最大值或最小值。

var data = [{ amount: 258, updated_at: '2019-10-17 01:45:17' }, { amount: 186, updated_at: '2019-10-17 01:45:17' }, { amount: 122, updated_at: '2019-10-17 01:46:31' }, { amount: 92, updated_at: '2019-10-17 01:46:31' }, { amount: 86, updated_at: '2019-10-17 01:47:47' }, { amount: 172, updated_at: '2019-10-17 01:47:47' }],
result = Object.values(data.reduce((r, { amount, updated_at }) => {
var time = updated_at.slice(0, 16);
if (!r[time]) r[time] = { time, open: amount, high: -Infinity, low: Infinity };
r[time].high = Math.max(r[time].high, amount);
r[time].low = Math.min(r[time].low, amount);
r[time].close = amount;
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新