按月份、日期、小时+间隔和孤岛问题分组



我需要计算(百分比(在一天、几个小时或一个月(working_time(中状态为true的时间。

我将我的表格简化为以下表格:

| date                      | status    |
|-------------------------- |--------   |
| 2018-11-05T19:04:21.125Z  | true      |
| 2018-11-05T19:04:22.125Z  | true      |
| 2018-11-05T19:04:23.125Z  | true      |
| 2018-11-05T19:04:24.125Z  | false     |
| 2018-11-05T19:04:25.125Z  | true      |
....

我需要得到这个结果(取决于参数(:

小时:

| date                      | working_time |
|-------------------------- |--------------|
| 2018-11-05T00:00:00.000Z  | 14           |
| 2018-11-05T01:00:00.000Z  | 15           |
| 2018-11-05T02:00:00.000Z  | 32           |
|...                        | ...          |
| 2018-11-05T23:00:00.000Z  | 13           |

数月:

| date                      | working_time |
|-------------------------- |--------------|
| 2018-01-01T00:00:00.000Z  | 14           |
| 2018-02-01T00:00:00.000Z  | 15           |
| 2018-03-01T00:00:00.000Z  | 32           |
|...                        | ...          |
| 2018-12-01T00:00:00.000Z  | 13           |

我的SQL查询如下:

 SELECT date_trunc('month', date)                                         as date,
       round((EXTRACT(epoch from sum(time_diff)) / 25920) :: numeric, 2) as working_time
FROM (SELECT date,
             status as current_status,
             (lag(status, 1) OVER (ORDER BY date)) AS previous_status,
             (date -(lag(date, 1) OVER (ORDER BY date))) AS time_diff
      FROM table
     ) as raw_data
WHERE current_status = TRUE AND previous_status = TRUE
GROUP BY date_trunc('month', date)
ORDER BY date;

它还可以,但速度很慢。有关于优化的想法吗?是否使用Row_Number((函数?

试试这个:

   SELECT t.month_reference as date,
            round(  sum(if(t_aux.status,1,0))  / 25920) :: numeric, 2) as working_time 

#我建议你使用这个数字,因为它是系统的正常运行时间60*18*24,

#如果我想要一个月内60*60*24*天(Last_day(t.month_reference((的总秒数,我会使用这个

FROM (SELECT date_trunc('month', t.date) as month_reference
          FROM table
         ) as t
    left join table t_aux
    on t.month_reference=date_trunc('month', t_aux.date) 

因此,当我们按月份分组时,sum((将只找到为true并且具有引用月份的行

   and t_aux.date < 
    (select t1.date 
    from table t1 
    where t.month_reference=date_trunc('month', t1.date) 
    and t1.status=false 
    order by t1.date asc limit 1 )

我添加了这个,所以它只选择为true的行,直到它在同一个月的引用中找到状态为false的行

    GROUP BY t.month_reference
    ORDER BY t.month_reference;

相关内容

  • 没有找到相关文章

最新更新