【问题标题】:postgres: group by row-specific 24 hour periods? [duplicate]postgres:按行特定的 24 小时时段分组? [复制]
【发布时间】:2018-09-06 14:57:50
【问题描述】:

我正在运行 Postgres 9.6。我有一个用户表:

 id                            | integer                     |           | not null | nextval('user_id_seq'::regclass)
 name                          | character varying           |           | not null | 

我有一个history 表:

 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;

但是有没有办法测量这些时间段,从他们第一次行动的时间开始计算,以允许在五分钟到午夜登录并在 10 分钟后离开的人?

我只是出于分析目的偶尔运行它,所以它是否很慢并不重要。

【问题讨论】:

  • @a_horse_with_no_name 不要认为这是重复的。在另一个问题中,询问如何按特定时间间隔分组。这里的问题略有不同:计算与行数无关的间隔。

标签: postgresql group-by


【解决方案1】:

db<>fiddle

SELECT 
    *, 
    trunc(                                                           -- E
        extract(epoch FROM (                                         -- C
            t_actioned -                                             -- B
            first_value(t_actioned) OVER (PARTITION BY actioned_by ORDER BY t_actioned)  -- A
         )) / 60 / 60 / 24                                           -- D
    ) + 1 as num_days                                                -- F
FROM history 

A:使用窗口函数first_valuehttps://www.postgresql.org/docs/current/static/tutorial-window.html获取每个用户的第一个时间戳

B:获取行的当前时间戳与用户的第一个时间戳之间的差异。结果是一个区间

C:将时间间隔转换为秒

D:将秒转换为天

E:四舍五入到全天(减少数字)

F:加 1,因为您不想要天数(一天中的 2 个时间戳产生天数 == 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        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2022-12-05
    • 2020-11-22
    相关资源
    最近更新 更多