Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行时间之间的总时间值的变化_Sql_Postgresql - Fatal编程技术网

Sql 运行时间之间的总时间值的变化

Sql 运行时间之间的总时间值的变化,sql,postgresql,Sql,Postgresql,我有一个程序,定期将用户移动数据连接信号强度、网络技术类型等详细信息记录到PostgreSQL中的单个表中。表中的相关字段为: networkmedium.id networkmedium.date_time networkmedium.medium_type 示例表可能如下所示: 0 | 2013-07-26 08:00:01 | 3G 1 | 2013-07-26 08:00:02 | GPRS 2 | 2013-07-26 08:00:06 | 3G 3 | 201

我有一个程序,定期将用户移动数据连接信号强度、网络技术类型等详细信息记录到PostgreSQL中的单个表中。表中的相关字段为:

networkmedium.id
networkmedium.date_time
networkmedium.medium_type
示例表可能如下所示:

0  |  2013-07-26 08:00:01  | 3G
1  |  2013-07-26 08:00:02  | GPRS
2  |  2013-07-26 08:00:06  | 3G
3  |  2013-07-26 08:00:10  | 3G
4  |  2013-07-26 08:00:16  | GPRS
我正试图从这些数据中获取特定媒体类型(即GPRS、3G等)的总持续时间,但我遇到了困难

在上面的例子中,我需要r1和r0,r2和r1,r3和r1,r4和r3之间的时间差,然后按中_类型将它们组合在一起,但我被如何最好地进行这个问题所困扰

提前感谢,,
崔佛。

我认为也可以采用r3-r2,它会给出相同的结果,不是吗?如果是这样的话,那么我想这就行了。但尚未测试:

选择t.medium\u类型,t.sumduration 从…起 选择n2.date\u time-n1.date\u time作为持续时间 从网络媒体n1内部连接网络媒体n2(在n2.id=n1.id+1上) as t 按介质类型分组 试试这个:

with CTE1 as
(
    select
        *,
        lead(date_time) over (order by date_time asc) as next_date_time
    from networkmedium
    order by date_time asc
)
select C1.medium_type, sum(date_part('second', C1.next_date_time - C1.date_time))
from CTE1 as C1
group by C1.medium_type

MEDIUM_TYPE |    SUM
--------------------
GPRS        |      4
3G          |     11
更复杂的方法

with CTE1 as
(
    select
        *,
        lag(medium_type) over (order by date_time asc) as prev_medium_type
    from networkmedium
    order by date_time asc
), CTE2 as
(
    select *, row_number() over(order by date_time) as row_num
    from CTE1
    where prev_medium_type <> medium_type or prev_medium_type is null
)
select C1.medium_type, sum(date_part('second', C2.date_time - C1.date_time)) as cnt
from CTE2 as C1
    left outer join CTE2 as C2 on C2.row_num = C1.row_num + 1
group by C1.medium_type

我不明白为什么是r3和r1,或者为什么不是r2-r1或r3-r2。连接的持续时间是多少?类似地,我真的不了解行选择和比较的逻辑。你能稍微充实一下这个例子并添加一个你期望从样本输入中得到的输出样本吗?另外:PostgreSQL版本?是,编辑了说明;r2-r1,但不是r3-r2,因为类型没有更改。虽然,我没有想到这一点,但计算出一条记录和前一条记录之间的时间差,然后将其加到总和中就足够了。这实际上会使它简化很多。你不能简单地添加一列并保存记录注册期间新插入行和前一行的差异吗?为了充实示例,我想看看GPRS_total=4秒r2-r1 3G_total=11秒r1-r0+r3-r2+r4-r3的结果依赖序列id真的很糟糕。它可以而且会有差距。基本上是真的,但是:1在这个问题中没有模式,所以我无法判断这是真的序列还是代码生成的东西。2在某些情况下,它是正常的,就像您从不删除或更新,只插入,并且所有备份都是带有重新创建的完整表转储。3需要有某种方法来指定事件的顺序,为了这个问题,我假设就是这样。使用这个id来设置事件的顺序是可以的。但你们永远不能依靠序列来减少间隙。您不需要任何更新或删除来向序列添加间隙。简单的回滚或序列缓存就可以了。