gpt4 book ai didi

postgresql - 选择 15 分钟窗口的数据 - PostgreSQL

转载 作者:行者123 更新时间:2023-11-29 11:48:20 26 4
gpt4 key购买 nike

是的,所以我在 PostgreSQL 中有一个这样的表:

timestamp              duration

2013-04-03 15:44:58 4
2013-04-03 15:56:12 2
2013-04-03 16:13:17 9
2013-04-03 16:16:30 3
2013-04-03 16:29:52 1
2013-04-03 16:38:25 1
2013-04-03 16:41:37 9
2013-04-03 16:44:49 1
2013-04-03 17:01:07 9
2013-04-03 17:07:48 1
2013-04-03 17:11:00 2
2013-04-03 17:11:16 2
2013-04-03 17:15:17 1
2013-04-03 17:16:53 4
2013-04-03 17:20:37 9
2013-04-03 17:20:53 3
2013-04-03 17:25:48 3
2013-04-03 17:29:26 1
2013-04-03 17:32:38 9
2013-04-03 17:36:55 4

我想得到以下输出:

timestampwindowstart = 2013-04-03 15:44:58

duration    count
1 0
2 1
3 0
4 1
9 0

timestampwindowstart = 2013-04-03 15:59:58

duration    count
1 0
2 0
3 0
4 0
9 1

timestampwindowstart = 2013-04-03 16:14:58

duration    count
1 1
2 0
3 1
4 0
9 0

timestampwindowstart = 2013-04-03 16:29:58

duration    count
1 2
2 0
3 0
4 0
9 1

等...

所以基本上它在 15 分钟的窗口中循环时间戳并输出不同的持续时间值及其频率(计数)。 timestampwindowstart 值是窗口的最早时间戳(即 timestampwindowfinish = timestampwindowstart + 15 分钟)

这样我就可以绘制 15 分钟间隔的直方图...

我已经尝试阅读,但我的头脑有点复杂,而且我没有太多时间...

感谢您的帮助!

最佳答案

快速而肮脏的方式:http://sqlfiddle.com/#!1/bd2f6/21我将我的专栏命名为 tstamp 而不是您的 timestamp

with t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
(select duration from tmp group by duration) b
)

select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmp on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration

简要说明:

  1. 计算最小和最大时间戳
  2. 在最小值和最大值之间生成 15 分钟的间隔
  3. 交叉连接具有唯一持续时间值的结果
  4. 左连接原始数据(左连接很重要,因为这将在输出中保留所有可能的组合,并且在给定间隔的持续时间不存在的地方将有 null
  5. 汇总数据。 count(null)=0

如果你有更多的表,算法应该应用在它们的并集上。假设我们有三个表tmp1、tmp2、tmp3,它们都有列tstampduration。我们可以扩展以前的解决方案:

with 

tmpout as (
select * from tmp1 union all
select * from tmp2 union all
select * from tmp3
)

,t as (
select
generate_series(mitstamp,matstamp,'15 minutes') as int,
duration
from
(select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
(select duration from tmpout group by duration) b
)

select
int as timestampwindowstart,
t.duration,
count(tmp.duration)
from
t
left join tmpout on
(tmp.tstamp >= t.int and
tmp.tstamp < (t.int + interval '15 minutes') and
t.duration = tmp.duration)
group by
int,
t.duration
order by
int,
t.duration

你真的应该了解 PostgreSQL 中的 with 子句。这对于 PostgreSQL 中的任何数据分析都是非常宝贵的概念。

关于postgresql - 选择 15 分钟窗口的数据 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516000/

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