我正在运行PostgreSQL 9.6
。
我有一张通话记录表,其中显示了通过VOIP
通话的人数。
它具有以下结构:
table: voice_records
session_id | user_id | total_seconds_talked
我每1到30分钟左右就会收到一次记录,因此,如果用户通话一个小时,我将收到该次通话的多个记录。
单个会话的所有记录将包含相同的session_id
,user_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
我猜它涉及到SELECT
和ORDER BY
和LIMIT 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 |
答案 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()