【问题标题】:Calculate duration from timestamps in one column SQL postgres从一列 SQL postgres 中的时间戳计算持续时间
【发布时间】:2018-11-10 17:55:15
【问题描述】:

我有一个 Postgres SQL 数据库,其中包含有关用户浏览在线内容的信息。我想计算每个浏览剧集的浏览持续时间(剧集是同一 Action_ID 的一个开始和一个停止动作),然后按用户和每天查看它。 我可以通过 User_ID 和 Action 列来识别用户,以查看浏览开始和结束的时间。

因此,我一直在弄清楚如何而不是让每个动作(具有开始和停止时间)有两行(具有开始和停止时间)在每个浏览动作中仅使用持续时间制作一行?

Date_time       User_ID Device_ID   Action  Action_ID  Channel_ID
22/07/2016 00:10    id2  pc      stop   123qwe      gn3
22/07/2016 00:10    id5  pc      start  345ert      tm6
22/07/2016 00:10    id1  mob     stop   567rfg      uy6
22/07/2016 00:12    id1  mob     start  567rfg      uy6
22/07/2016 00:13    d3   pc      stop   987yhn      io9

我已经尝试过Calculate duration between momentjs timestamps in UTCCalculate duration between timestamps in one column 并且我已经进行了一些谷歌搜索,但我没有更进一步。

谢谢!

【问题讨论】:

  • 请解释定义“浏览情节”的逻辑。
  • 浏览片段将是同一 Action_ID 的“开始”和“停止”之间的时间
  • @GordonLinoff 刚刚编辑,它现在应该在那里

标签: sql postgresql


【解决方案1】:

你可以得到日期:

select date_trunc('day', date_time) as theday, user_id, action_id,
       min(date_time) filter (where action = 'start') as start_time,
       max(date_time) filter (where action = 'stop') as stop_time
from t
group by theday, user_id, action_id;

持续时间就是它们之间的差异——但确切的逻辑取决于您希望如何查看持续时间。

【讨论】:

  • 我尝试了这个解决方案,但它给了我一个错误:“函数 date_trunc(unknown, character varying) 不存在。没有函数与给定的名称和参数类型匹配。”我认为这是由于 'date_time' 列数据类型引起的,我尝试使用 CAST 将其更改为时间戳。这不起作用 - 是因为“date_time”列中没有秒数吗?
  • 修复您的数据,以便将日期存储为 datetime 而不是字符串。 date_trunc() 在 Postgres 中运行良好。您可以尝试'day'::text修复列类型之后。
  • 感谢 Gordon,我修复了数据类型并将数据拆分为 2 个单独的列:一列带有日期,一列带有时间。因此,上述解决方案不是以分钟为单位计算从开始到停止的动作持续时间的期望输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
相关资源
最近更新 更多