Postgresql postgres:按行分组特定的24小时周期?
我正在参加9.6级的博士后考试。我有一个用户表:Postgresql postgres:按行分组特定的24小时周期?,postgresql,group-by,Postgresql,Group By,我正在参加9.6级的博士后考试。我有一个用户表: id | integer | | not null | nextval('user_id_seq'::regclass) name | character varying | | not null | 我有一个历史记录表格: actio
id | integer | | not null | nextval('user_id_seq'::regclass)
name | character varying | | not null |
我有一个历史记录
表格:
actioned_by | integer | | |
category | character varying | | not null |
t_actioned | timestamp without time zone | | not null |
我想要一种方法,用一个整数字段num_days
来注释每个用户,该字段指示他们有多少不同的24小时活动周期
我知道如何获取每个用户活动的不同日历日数:
SELECT d.actioned_by, COUNT(*) AS cnt FROM
(SELECT date_trunc('day', t_actioned) AS day, actioned_by
FROM history
GROUP BY day, actioned_by) d
GROUP BY actioned_by
ORDER BY cnt DESC;
但是有没有一种方法可以测量这些时间段,从他们第一次行动的时间开始,允许人们在5分钟到午夜登录,10分钟后离开
我只是为了分析目的偶尔运行它,所以它是否慢并不重要。
A:使用窗口函数获取每个用户的第一个时间戳
B:获取行的当前时间戳和用户的第一个时间戳之间的差异。结果是一个间隔
C:将时间间隔转换为秒
D:将秒转换为天
E:从四舍五入到全天(减少数字)
F:添加1,因为您不需要天数的差异(一天内两个时间戳产生的天数==0),而是需要天数
测试数据:
actioned_by t_actioned
----------- -------------------
1 2018-09-08 23:55:00
1 2018-09-09 00:10:00
1 2018-09-10 00:05:00
1 2018-09-10 00:15:00
2 2018-09-09 20:15:00
2 2018-09-10 02:15:00
2 2018-09-10 08:15:00
2 2018-09-10 14:15:00
2 2018-09-10 20:14:00
结果:
actioned_by t_actioned num_days
----------- ------------------- --------
1 2018-09-08 23:55:00 1.0
1 2018-09-09 00:10:00 1.0
1 2018-09-10 00:05:00 2.0
1 2018-09-10 00:15:00 2.0
2 2018-09-09 20:15:00 1.0
2 2018-09-10 02:15:00 1.0
2 2018-09-10 08:15:00 1.0
2 2018-09-10 14:15:00 1.0
2 2018-09-10 20:14:00 1.0
@没有名字的马不要认为这是重复的。在另一个问题中,问题是如何按一定的时间间隔分组。这里的问题略有不同:独立于行数计算间隔。
actioned_by t_actioned num_days
----------- ------------------- --------
1 2018-09-08 23:55:00 1.0
1 2018-09-09 00:10:00 1.0
1 2018-09-10 00:05:00 2.0
1 2018-09-10 00:15:00 2.0
2 2018-09-09 20:15:00 1.0
2 2018-09-10 02:15:00 1.0
2 2018-09-10 08:15:00 1.0
2 2018-09-10 14:15:00 1.0
2 2018-09-10 20:14:00 1.0