gpt4 book ai didi

javascript - 将 PostgreSQL 数据正确解析为 Highcharts 图表对象

转载 作者:行者123 更新时间:2023-11-29 14:25:58 25 4
gpt4 key购买 nike

我正在尝试从 PostgreSQL 获取时间序列数据,在成功查询和解析数据后,我在对其进行索引时遇到了一些问题。这个错误可能很小,但我就是找不到。

从 PostgreSQL 获取数据后,它看起来像这样:

[
{ id: 2,
time: 2019-09-12T03:36:04.433Z,
value: 0.311303124694538
},
{ id: 2,
time: 2019-09-12T03:36:03.434Z,
value: 0.13233108292117
},
{ id: 3,
time: 2019-09-12T03:36:03.434Z,
value: 0.13233108292117 }
]

在这一步之后,我将按 id 减少数据:

    let results = sqlresult.rows.reduce(function(results, row) {
(results[row.id] = results[row.id] || []).push([row.time,row.value]);
return results;
}, {})

let clonedObj = { ...results };

经过这一步数据格式化如下:

{ '2':
[ [ 2019-09-12T03:36:04.433Z, 0.311303124694538 ],
[ 2019-09-12T03:36:03.434Z, 0.13233108292117 ],
[ 2019-09-12T03:36:02.432Z, 0.171794173529729 ]
]
}

但是一旦我将其放入 Highchart 中,它就无法工作了。我的问题可能是我没有完全理解 reduce 函数是如何工作的,现在我正在尝试复制它。如果你们中的一些人可以告诉我如何避免这一步并在数据减少步骤中完成所有工作,我将不胜感激。

    for(let i=0; i< Object.keys(clonedObj).length; i++){

highchart[i] = {
name: Object.keys(clonedObj)[i],
data: clonedObj[i]
}
}

我期待如下结果:

[{"name":1,"data":[["2019-09-12T03:36:00.433Z",20],["2019-09-12T03:35:38.433Z",-20]]},{"name":2,"data":[["2019-09-12T03:36:04.433Z",0.311303124694538]}]]

最佳答案

从您的格式良好的数据列表来看,您似乎已经在使用 Postgres 打包数据行。这是我一直在做的事情,但没有一些非常狭窄的限制。我想在这方面做得更好,所以我想我会给你一些时间。首先,我用您的数据创建了一个名为“reading”的表:

CREATE TABLE IF NOT EXISTS reading (
id integer,
"time" text,
"value" real
);

我通过此查询返回了一个与您的顶部列表类似的列表:

select array_to_json(array_agg(row_to_json(reading_row))) as reading_object
from (select id, time, value from reading) as reading_row

你的目标输出示例不适合我解析,我想你是在追求这个:

[ 
{
"name":1,
"data":[
[
"2019-09-12T03:36:00.433Z",
20
],
[
"2019-09-12T03:35:38.433Z",
-20
]
]
},
{
"name":2,
"data":[
"2019-09-12T03:36:04.433Z",
0.311303124694538
]
}
]

公平警告:是的,我真的不知道该怎么做,我希望有人用一个简单的脚本来回答,以在 Postgres 端生成您想要的格式。但我开始了。检查一下:

select id, json_object_agg(time, value order by time)
from reading
group by id

这是我得到的:

2   "{ ""2019-09-12T03:36:03.434Z"" : 0.132331, ""2019-09-12T03:36:04.433Z"" : 0.311303 }"
3 "{ ""2019-09-12T03:36:03.434Z"" : 0.132331 }"

这里有一些……不对……但越来越接近:

select array_to_json(array_agg(row_to_json(reading_row))) as reading_object
from (
select id, json_object_agg(time, value order by time) as data
from reading
group by id
) as reading_row

哪个返回:

[ 
{
"id":2,
"data":{
"2019-09-12T03:36:03.434Z":0.132331,
"2019-09-12T03:36:04.433Z":0.311303
}
},
{
"id":3,
"data":{
"2019-09-12T03:36:03.434Z":0.132331
}
}
]

我在这里又做了一次破解,这可能是您想要的或接近的。我注意到您将“id”重命名为“name”,所以这是在最后的查询中:

 select array_to_json(array_agg(row_to_json(subquery)))
from (
select id as name,
array_to_json(array_agg(json_build_object('time', time, 'value', value))) as data
from reading
group by id
) subquery

漂亮的输出看起来像这样:

[ 
{
"name":2,
"data":[
{
"time":"2019-09-12T03:36:04.433Z",
"value":0.311303
},
{
"time":"2019-09-12T03:36:03.434Z",
"value":0.132331
}
]
},
{
"name":3,
"data":[
{
"time":"2019-09-12T03:36:03.434Z",
"value":0.132331
}
]
}
]

此变体具有相同的结构,但数组中的元素没有标签:

选择 array_to_json(array_agg(row_to_json(子查询))) 从 ( 选择 id 作为名称, array_to_json(array_agg(array[time, value::text])) 作为数据 从阅读按编号分组 ) 子查询

除了将数值转换为文本外,我认为这是您要求的:

 select array_to_json(array_agg(row_to_json(subquery)))
from (
select id as name,
array_to_json(array_agg(array[time, value::text])) as data
from reading
group by id
) subquery

[
{
"name":2,
"data":[
[
"2019-09-12T03:36:04.433Z",
"0.311303"
],
[
"2019-09-12T03:36:03.434Z",
"0.132331"
]
]
},
{
"name":3,
"data":[
[
"2019-09-12T03:36:03.434Z",
"0.132331"
]
]
}
]

注意:在您的示例中,我看不到您从哪里获得 20, -20 的输出。

在 array_to_json()、row()、array_agg() 和 json_build_object() 之间,看起来您可以获得所需的大部分格式。

希望真正知道自己在做什么的人插话。

关于javascript - 将 PostgreSQL 数据正确解析为 Highcharts 图表对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com