【问题标题】:postgres update table with time evolution column带有时间演化列的 postgres 更新表
【发布时间】:2020-07-08 15:55:35
【问题描述】:

手头有这张桌子:

SELECT * FROM mutable LIMIT 10;
user_id |     session_id     |       timestamp        
---------+--------------------+------------------------
     180 | 179020080820120904 | 2008-08-20 12:09:04+01
     180 | 179020080820120904 | 2008-08-20 12:09:07+01
     180 | 179020080820120904 | 2008-08-20 12:10:35+01
     180 | 179020080820120904 | 2008-08-20 12:10:37+01
     180 | 179020080820120904 | 2008-08-20 12:10:39+01
     180 | 179020080820120904 | 2008-08-20 12:10:41+01
     180 | 179020080820120904 | 2008-08-20 12:10:43+01
     180 | 179020080820120904 | 2008-08-20 12:10:45+01
     180 | 179020080820120904 | 2008-08-20 12:10:47+01
     180 | 179020080820120904 | 2008-08-20 12:10:49+01
(10 rows)

所以我想通过添加一列 t_evolution 来修改表,该列显示跟踪从一个记录出现到下一个记录的持续时间,考虑到 timestamp 列,如下所示:

+---------------------------------------------------------+--------------------+
|     user_id |     session_id     |       timestamp      |    t_evolution     |
+---------------------------------------------------------+--------------------+
|      180 | 179020080820120904 | 2008-08-20 12:09:04+01  |        0           |
|      180 | 179020080820120904 | 2008-08-20 12:09:07+01  |        3           |
|      180 | 179020080820120904 | 2008-08-20 12:10:35+01  |       92           |
|      180 | 179020080820120904 | 2008-08-20 12:10:37+01  |       94           |
|      180 | 179020080820120904 | 2008-08-20 12:10:39+01  |       96           |
|      180 | 179020080820120904 | 2008-08-20 12:10:41+01  |       98           |
|      180 | 179020080820120904 | 2008-08-20 12:10:43+01  |      100           |
|      180 | 179020080820120904 | 2008-08-20 12:10:45+01  |      102           |
|      180 | 179020080820120904 | 2008-08-20 12:10:47+01  |      104           |
|      180 | 179020080820120904 | 2008-08-20 12:10:49+01  |      106           |
+---------------------------------------------------------+--------------------+
(10 rows)

【问题讨论】:

  • 在您预期结果的 3d 行中,t_evolution 应该是 91,其余的都减去 1。

标签: sql postgresql aggregate-functions


【解决方案1】:

您可以从每个时间戳中减去第一个时间戳,然后使用EXTRACT() 来获取秒数。
带窗口功能FIRST_VALUE()

SELECT *,
  EXTRACT(EPOCH FROM ("timestamp" - FIRST_VALUE("timestamp") OVER (ORDER BY "timestamp"))) t_evolution
FROM mutable

在您的示例数据中,所有行都包含 user_idsession_id 列的相同值。如果您希望新列跟踪每个user_id 和/或session_id 的持续时间,那么您可以将OVER 子句更改为:

OVER (PARTITION BY user_id ORDER BY "timestamp") 

或:

OVER (PARTITION BY user_id, session_id ORDER BY "timestamp")  

请参阅demo
结果:

| user_id | session_id         | timestamp                | t_evolution |
| ------- | ------------------ | ------------------------ | ----------- |
| 180     | 179020080820120904 | 2008-08-20T12:09:04.000Z | 0           |
| 180     | 179020080820120904 | 2008-08-20T12:09:07.000Z | 3           |
| 180     | 179020080820120904 | 2008-08-20T12:10:35.000Z | 91          |
| 180     | 179020080820120904 | 2008-08-20T12:10:37.000Z | 93          |
| 180     | 179020080820120904 | 2008-08-20T12:10:39.000Z | 95          |
| 180     | 179020080820120904 | 2008-08-20T12:10:41.000Z | 97          |
| 180     | 179020080820120904 | 2008-08-20T12:10:43.000Z | 99          |
| 180     | 179020080820120904 | 2008-08-20T12:10:45.000Z | 101         |
| 180     | 179020080820120904 | 2008-08-20T12:10:47.000Z | 103         |
| 180     | 179020080820120904 | 2008-08-20T12:10:49.000Z | 105         |

【讨论】:

  • 所以我可以update table add column t_evolution using #your_query..?
  • 是否要在表格中新建一列?
  • @yes,正如你所观察到的那样使用OVER (PARTITION BY user_id, session_id ORDER BY "timestamp")
  • 给我几分钟。
  • 谢谢你,让我开心。
猜你喜欢
  • 2019-04-11
  • 2018-01-18
  • 2021-10-18
  • 2019-11-08
  • 2019-11-06
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多