显示记录之间的差异时进行选择

时间:2018-06-29 12:22:53

标签: sql postgresql postgresql-9.6

我正在运行PostgreSQL 9.6

我有一张通话记录表,其中显示了通过VOIP通话的人数。

它具有以下结构:

table: voice_records

session_id | user_id | total_seconds_talked

我每1到30分钟左右就会收到一次记录,因此,如果用户通话一个小时,我将收到该次通话的多个记录。 单个会话的所有记录将包含相同的session_iduser_id,但递增total_seconds_talked

例如。

234gdd-542-vffd, 1001, 5
234gdd-542-vffd, 1001, 11
234gdd-542-vffd, 1001, 532
234gdd-542-vffd, 1001, 234
234gdd-542-vffd, 1001, 1159

要知道,我可能会以错误的顺序收到记录。

我想创建一个VIEW,我将记录视为个人记录, 因此,对于上面的示例,我将得到记录之间的差异-并且由于它是VIEW,因此应随时进行计算,因此在SELECT插入VIEW时纠正了错误的顺序

例如。

SELECT * FROM voice_records WHERE session_id = '234gdd-542-vffd'

OUTPUT:

234gdd-542-vffd, 1001, 5
234gdd-542-vffd, 1001, 6
234gdd-542-vffd, 1001, 223
234gdd-542-vffd, 1001, 298
234gdd-542-vffd, 1001, 627

我猜它涉及到SELECTORDER BYLIMIT 1的某种情况,但是我确实对如何正确且最有效地执行此操作有所限制。 以及应该放置哪些INDEX

更新

示例简单SELECT

 user_id |   session_id    | seconds_this_time
---------+-----------------+--------
 1001    | 234gdd-542-vffd | 313557
 1001    | 234gdd-542-vffd | 314844
 1001    | 234gdd-542-vffd | 338980
 1001    | 234gdd-542-vffd | 507246
 1001    | 234gdd-542-vffd | 509233
 1001    | 234gdd-542-vffd | 509441
 1001    | 234gdd-542-vffd | 553260
 1001    | 234gdd-542-vffd | 556985
 1001    | 234gdd-542-vffd | 581958
 1001    | 234gdd-542-vffd | 586079
 1001    | 234gdd-542-vffd | 597381
 1001    | 234gdd-542-vffd | 597745
 1001    | 234gdd-542-vffd | 611672
 1001    | 234gdd-542-vffd | 709918
 1001    | 234gdd-542-vffd | 725510
 1001    | 234gdd-542-vffd | 743432
 1001    | 234gdd-542-vffd | 743835
 1001    | 234gdd-542-vffd | 743835
 1001    | 234gdd-542-vffd |

具有lag功能:

 user_id |   session_id    | seconds_this_time
---------+-----------------+--------
 1001    | 234gdd-542-vffd |
 1001    | 234gdd-542-vffd |   1287
 1001    | 234gdd-542-vffd |  24136
 1001    | 234gdd-542-vffd | 168266
 1001    | 234gdd-542-vffd |   1987
 1001    | 234gdd-542-vffd |    208
 1001    | 234gdd-542-vffd |  43819
 1001    | 234gdd-542-vffd |   3725
 1001    | 234gdd-542-vffd |  24973
 1001    | 234gdd-542-vffd |   4121
 1001    | 234gdd-542-vffd |  11302
 1001    | 234gdd-542-vffd |    364
 1001    | 234gdd-542-vffd |  13927
 1001    | 234gdd-542-vffd |  98246
 1001    | 234gdd-542-vffd |  15592
 1001    | 234gdd-542-vffd |  17922
 1001    | 234gdd-542-vffd |    403
 1001    | 234gdd-542-vffd |      0
 1001    | 234gdd-542-vffd |

1 个答案:

答案 0 :(得分:2)

您显然想要ContextHolder

lag()

根据您的描述,正在进行的呼叫的值可能会更改,因为未按顺序接收记录。

编辑:

如果由于某种原因您不能使用select user_id, session_id, (total_seconds_talked - lag(total_seconds_talked, 1, 0::bigint) over (partition by user_id, session_id order by total_seconds_talked) ) as seconds_this_time from voice_records; 的三个参数形式,只需使用lag()

coalesce()