【问题标题】:Postgresql: Joining TimeSeries data with different time scaled: Weekly, Daily and MonthlyPostgresql:加入不同时间尺度的时间序列数据:每周、每日和每月
【发布时间】:2020-09-20 15:36:44
【问题描述】:

我有来自相同来源的不同速率的数据。我想绘制数据(并进行一些阈值处理等),最简单的方法是将其视为时间序列数据。

我的数据如下:

SourceID, SubmissionTime,  Daily_Data
-------------------------------
ABC,    2020-01-01 10h32,  100
ABC,    2020-01-01 10h45,  101
ABC,    2020-01-02 09h01,  120
DEF,    2020-01-01 15h30,  123

SourceID, SubmissionTime,  Weekly_Data
-------------------------------
ABC,    2020-01-01 09h00,  Joe
ABC,    2020-01-08 09h21,  Soap
ABC,    2020-01-14 15h20,  Bill

每天和每周的提交大约相隔一天或一周,并且是用户输入,因此存在差距、延迟、错误数据等。我想得到的是这样的:

SourceID, Daily_Date, Weekly_date, Weekly_datatime, Weekly_Data
-------------------------------
ABC,    2020-01-01, 2020-01-01 09h00,  101, Joe
ABC,    2020-01-02, 2020-01-01 09h00,  120, Joe
ABC,    2020-01-03, 2020-01-01 09h00,  122, Joe
...
ABC,    2020-01-07, 2020-01-01 09h00,  133, Joe
ABC,    2020-01-07, 2020-01-14 15h20,  145, Soap

提取日期非常简单,但是只有在每周提交发生后,我才能对行进行最近的日期时间连接。我一直在 TimscaleDB 中做类似的事情,但现在这是在其他人的数据库上,他们不想要额外的扩展......

【问题讨论】:

  • 您的结果与样本数据有什么关系?额外的日期从何而来?第三排的 122 是哪来的?
  • 都是虚构的数据。 122 只是为了填补空白并指示可能的输出,而不是 100% 准确。我认为这个概念很简单,不需要对虚拟数据迂腐。
  • 。 .你的虚构数据是我的困惑。

标签: sql postgresql time-series


【解决方案1】:

我想通了。这基本上是一个“最后一个对象结转”问题,我直接连接了每日/每周/每月表,并将最后的每月/每周观察结果转发到每日时间样本。

More info here

我创建了一个函数、一个聚合,然后通过它们运行表:

CREATE OR REPLACE FUNCTION fun(a FLOAT, b FLOAT)
RETURNS FLOAT
LANGUAGE SQL
AS '
  SELECT COALESCE(b, a)
';

select a,b,t,v,
    fun(t,v) as v_or_t
from tbl
order by a,b,t
;

create or replace function locf_s(a float, b float)
returns float
language sql
as '
  select coalesce(b, a)
';

drop aggregate if exists locf(float);
CREATE AGGREGATE locf(FLOAT) (
  SFUNC = locf_s,
  STYPE = FLOAT
);

最后:

with weekly_data as (SELECT source_id, submissiontime, weekly_data from weekly_table)
select distinct on (source_id, submissiontime)
    source_id,
    submissiontime,
    daily_data,
    locf(weekly_data) over (PARTITION by source_id ORDER by submissiontime) as weekly_data,

from daily_table
join weekly_table on daily_table.source_id = weekly_table.source_id 
order by source_id, submissiontime desc;

这只是伪代码,不完全是我使用的(因为我有多个表和奇怪的数据)所以请原谅任何错误,我希望这个想法能够得到解决。

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2014-08-17
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多