- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下数据源,其中有多个物理值(每列一个)来自不同时间的多个设备:
+-----------+------------+---------+-------+
| id_device | timestamp | Vln1 | kWl1 |
+-----------+------------+---------+-------+
| 123 | 1495696500 | | |
| 122 | 1495696800 | | |
| 122 | 1495697100 | 230 | 5.748 |
| 122 | 1495697100 | 230 | 5.185 |
| 124 | 1495700100 | 226.119 | 0.294 |
| 122 | 1495713900 | 230 | |
| 122 | 1495716000 | | |
| 122 | 1495716300 | 230 | |
| 122 | 1495716300 | | |
| 122 | 1495716300 | | |
| 122 | 1495716600 | 230 | 4.606 |
| 122 | 1495716600 | | |
| 124 | 1495739100 | | |
| 123 | 1495739400 | | |
+-----------+------------+---------+-------+
timestamp
是(不幸的是)bigint
并且每个设备在不同时间以不同频率发送数据:一些设备每 5 分钟推送一次,其他设备每 10 分钟推送一次,其他设备每 15 分钟一次物理值可以是 NULL
。
前端应用程序需要绘制特定时间戳的图表 - 让我们说折线图,每分钟都有时间滴答。时间标记由用户选择。图表可以由多个设备的多个物理值组成,每一行都是对后端的独立请求。
让我们考虑一个案例:
前端应用期望的是标准化结果:
<timestamp>, <value>
在哪里
timestamp
表示舍入时间(00:00、00:10、00:20 等等)值
(例如:在 00:00 和 00:10 之间每 5 分钟推送一次的设备将有 2 个值),一个将返回值,这是一个聚合值(AVG)为了完成这个,我创建了一些 plpgsql 函数来帮助我,但我不确定我正在做的在性能方面是最好的。
基本上我做的是:
范围
JOIN
具有范围的时间戳标准化数据。如果同一范围内有多个值,则聚合这是我的功能:
create or replace function app_iso50k1.blkGetTimeSelParams(
t_end bigint,
t_granularity integer,
t_span bigint,
OUT delta_time_bucket interval,
OUT b_timebox timestamp,
OUT e_timebox timestamp)
as
$$
DECLARE
delta_time interval;
BEGIN
/* normalization: no minutes */
t_end = extract('epoch' from date_trunc('minute', (to_timestamp(t_end) at time zone 'UTC')::timestamp));
delta_time = app_iso50k1.blkGetDeltaTimeBucket(t_end, t_granularity);
e_timebox = date_trunc('minute', (to_timestamp(t_end - extract('epoch' from delta_time)) at time zone 'UTC'))::timestamp;
b_timebox = (to_timestamp(extract('epoch' from e_timebox) - t_span) at time zone 'UTC')::timestamp;
delta_time_bucket = delta_time;
END
$$ immutable language 'plpgsql' security invoker;
create or replace function app_iso50k1.getPhyMetData(
tablename character varying,
t_span bigint,
t_end bigint,
t_granularity integer,
idinstrum integer,
id_device integer,
varname character varying,
op character varying,
page_size int,
page int)
RETURNS TABLE(times bigint , val double precision) as
$$
DECLARE
series REFCURSOR;
serie RECORD;
first_notnull bool = false;
prev_val double precision;
time_params record;
q_offset int;
BEGIN
time_params = app_iso50k1.blkGetTimeSelParams(t_end, t_granularity, t_span);
if(page = 1) then
q_offset = 0;
else
q_offset = page_size * (page -1);
end if;
if not public.blkIftableexists('resgetphymetdata')
THEN
create temporary table resgetphymetdata (times bigint, val double precision);
ELSE
truncate table resgetphymetdata;
END IF;
execute format($ff$
insert into resgetphymetdata (
/* generate every possible range between these dates */
with ranges as (
select generate_series($1, $2, interval '$5 minutes') as range_start
),
/* normalize your data to which <t_granularity>-minute interval it belongs to */
rounded_hst as (
select
date_trunc ('minutes', (to_timestamp("timestamp") at time zone 'UTC')::timestamp)::timestamp -
mod (extract ('minutes' from ((to_timestamp("timestamp") at time zone 'UTC')::timestamp))::int, $5) * interval '1 minute' as round_time,
*
from public.%I
where
idinstrum = $3 and
id_device = $4 and
timestamp <= $8
)
select
extract('epoch' from r.range_start)::bigint AS times,
%s (hd.%I) AS val
from
ranges r
left join rounded_hst hd on r.range_start = hd.round_time
group by
r.range_start
order by
r.range_start
LIMIT $6 OFFSET $7
);
$ff$, tablename, op, varname) using time_params.b_timebox, time_params.e_timebox, idinstrum, id_device, t_granularity, page_size, q_offset, t_end;
/* data cleansing: val holes between not-null values are filled with the previous value */
open series no scroll for select * from resgetphymetdata;
loop
fetch series into serie;
exit when not found;
if NOT first_notnull then
if serie.val NOTNULL then
first_notnull = true;
prev_val = serie.val;
end if;
else
if serie.val is NULL then
update resgetphymetdata
set val = prev_val
where current of series;
else
prev_val = serie.val;
end if;
end if;
end loop;
close series;
return query select * from resgetphymetdata;
END;
$$ volatile language 'plpgsql' security invoker;
您是否看到我编写的代码有好的替代方案?有改进的余地吗?谢谢!
最佳答案
您可以使用纯 SQL 查询完全转换您的迭代逻辑。您可以使用函数参数化查询。为了获得更好的性能,请为您的函数使用 sql 语言。
您可以使用此处解释的 Window 函数在时间序列间隔上构建部分总和
Window function trailing dates in PostgreSQL
其他建议
关于postgresql - 如何优化需要时间戳规范化的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44565862/
我正在寻找一个库函数来规范化 Python 中的 URL,即删除路径中的“./”或“../”部分,或添加默认端口或转义特殊字符等。结果应该是指向同一网页的两个 URL 唯一的字符串。例如 http:/
我有 2 个版本的 XSD 文件,我想看看它们之间做了哪些更改。不幸的是,发布者选择完全重写 XSD,更改元素、属性、命名空间前缀等的顺序。是否有工具(命令行或 GUI)可以将它们转换为我可以使用的规
我一直在想,同时使用 normalize.css 和某种 CSS 重置会不会有什么大问题?我一直在四处挖掘,我遇到的所有文章都只是以非此即彼的方式谈论它们,而没有谈及将两者结合起来。 诚然,我在规范化
这对我来说是一个新话题,我已经阅读了几篇文章,但我仍然不清楚,甚至不确定以下问题是否与这篇文章的标题有关。 我的系统向用户发送数据。用户可以选择通过以下方式发送数据: XML 电子邮件 发布 根据用户
我正在从设计不佳的旧数据库升级到新数据库。在旧数据库中有带有字段 Id 和 Commodities 的 tableA。 Id 是主键,包含一个 int,Commodities 包含一个逗号分隔的列表。
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
假设您正在处理常规的联系人数据库(您知道...姓名,电话号码,地址,电子邮件等...)。如果您在本地对此感到疑惑,那么一般来说这不是什么大问题,但是当我们查看国际场景时,它就是。 查看电话号码系统,您
尝试在不使用 python 中的任何包的情况下计算 L1 范数 假设我有向量:l = [2.34, 3.32, 6.32, 2.5, 3,3, 5.32] 我想找到这个向量的L1,没有任何包: 我已经
我们拥有 10 年的存档体育数据,分布在不同的数据库中。 尝试将所有数据合并到一个数据库中。由于我们将处理 10 倍的记录数量,因此我现在正在尝试重新设计架构以避免潜在的性能影响。 一项更改是将团队名
我正在使用以下设计为我的网站创建表格 设计1 设计2 由于并非所有注册用户都会尝试挑战,因此设计 1 适合。插入第三个表时,表 2 分数会相应更新。但是 user_id 字段变得多余。 设计 2 中为
我有一个带有字段 json 的表模板。由于 json 对于许多 template 来说可能是相同的 (1:n),我创建了另一个表 template_json 并添加了字段 template_json_
我有一个具有正交投影的 C++/OpenGl/Glut 应用程序。 窗口的宽度为 500 x 500 像素。目前,当鼠标点击发生时,该点将在 (0,0) 和 (500, 500) 之间。 我想获取该点
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我的印象是 JavaScript 解释器假设它正在解释的源代码已经被规范化。什么,规范化到底是做什么的?它不能是文本编辑器,否则源的明文表示会改变。是否有一些执行规范化的“预处理器”? 最佳答案 EC
我被分配了一项任务,但我不确定如何完成它: 我必须构建一个支持多种设备的消息系统,并且它应该尽可能高效。用户最多可以有 10 台设备,当用户收到消息时,所有设备都需要接收消息。 我有两个想法: Tab
我正在尝试将规范化合并到我的数据库设计中,互联网上提供的一些解释让我有点困惑 - 我不确定我是否在朝着正确的方向前进? 到目前为止我有: 用户: id username password 用户配置文件
规范化数据时,是否可以接受在同一张表中重复使用外键? 例如一家 express 公司有一个订单表和一个客户表,订单表会记录从哪个客户那里取件(Customer_ID),并且还会有一列用于说明要交付给哪
用 Java 制作规范形式的 XML 文件的最简单方法是什么?你有一些完成的代码吗?我在网上找到了几个链接,比如 this , this , 和 this ,但我无法让它工作:/ 谢谢, 伊凡 编辑:
在 Python 中是否有标准方法来规范化 unicode 字符串,以便它只理解可用于表示它的最简单的 unicode 实体? 我的意思是,可以将 ['LATIN SMALL LETTER A', '
我知道这个问题已经讨论了很多——但实际上我还没有找到这个问题的最终答案。 我想从我的 VBA(Excel)脚本中的日期“删除”(或更确切地说是标准化)时间。例如。: 20.12.2017 15:16
我是一名优秀的程序员,十分优秀!