【问题标题】:SQL to select multiples of a valueSQL选择值的倍数
【发布时间】:2020-03-02 17:43:47
【问题描述】:

我需要生成烛台图并需要转换此表

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值包括time,从updated_at列得到,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 更好地实现这一点,我一点也不介意。

【问题讨论】:

  • 到目前为止你做了什么?
  • json对象中总结了什么,怎么总结的?
  • 最近大部分数据库引擎都支持在单元格中存储 json 对象并围绕它进行查询
  • 什么是数量和数量?你试过什么?你如何从给定的数据中得到想要的结果?为什么结果中有分钟而不是五分钟?数据只是一种产品吗?为什么 id、userid、orderid 很重要?
  • 很难看出您是如何从该数据集中得出该结果的,并且您断言“每次都在从表中的第一条记录开始的 5 分钟间隔内”是不正确的。

标签: javascript php mysql sql json


【解决方案1】:

通过按时间对数据进行排序,您可以按分钟分组(仅获取 ISO 字符串的一部分)并将第一个值用作打开,并将每个值用作结束值。要获得高值和低值,您可以取最大值或最小值。

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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多