postgreSQL - 满足条件的计数“孤岛”

时间:2017-01-26 23:32:57

标签: postgresql window-functions gaps-and-islands

我在PostgreSQL 9.5工作。我正在使用表格中的加速度计数据,我希望从中关注不活动的“孤岛”,其中x OR y < 15至少10分钟(或2个连续数据点))。更具体地说,我需要计算每天每个activity_sensors_code出现的“孤岛”的数量,并且我也对这些时间段的开始/停止时间感兴趣。

  data_id    activity_sensors_code   band_id   acquisition_time   activity_x   activity_y   temp   insert_timestamp   loaf_count  
  33607382   60437                   B024      10/17/2015 18:00   11           45           30     10:27.4                        
  33607383   60437                   B024      10/17/2015 18:05   15           44           30     10:27.4                        
  33607384   60437                   B024      10/17/2015 18:10   9            42           31     10:27.4                        
  33607385   60437                   B024      10/17/2015 18:15   23           93           32     10:27.4                        
  33607386   60437                   B024      10/17/2015 18:20   16           74           32     10:27.4                        
  33607387   60437                   B024      10/17/2015 18:25   8            0            30     10:27.4            1           
  33607388   60437                   B024      10/17/2015 18:30   1            0            29     10:27.4            1           
  33607389   60437                   B024      10/17/2015 18:35   0            0            30     10:27.4            1           
  33607390   60437                   B024      10/17/2015 18:40   0            0            30     10:27.4            1           
  33607391   60437                   B024      10/17/2015 18:45   2            9            30     10:27.4            1           
  33607392   60437                   B024      10/17/2015 18:50   4            10           30     10:27.4            1           
  33607393   60437                   B024      10/17/2015 18:55   0            1            30     10:27.4            1           
  33607394   60437                   B024      10/17/2015 19:00   27           132          30     10:27.4                        
  33607395   60437                   B024      10/17/2015 19:05   7            44           30     10:27.4                        
  33607396   60437                   B024      10/17/2015 19:10   18           63           30     10:27.4                        

期望的结果:

+-----------+--------+-----------------+----------------+
| collar_id | count  | timestamp_start | timestamp_end  |
+-----------+--------+-----------------+----------------+
| 60437     | 1      |10/17/2015 18:25 |10/17/2015 18:55|
+-----------+--------+-----------------+----------------+

如果有其他“孤岛”,它们应该按顺序计数直到那天结束,然后计数应该重新启动。开始我尝试使用dense_rank为每个“孤岛”编号,除了我是只有回来的。 下面的代码是我尝试计算的部分,我还没有完成这一步,因为我只得到1个。

UPDATE analysis.nb_60437
SET
loaf_count = i.lfct
FROM (
SELECT 
DENSE_RANK () 
OVER (PARTITION BY     DATE_PART('month',acquisition_time),DATE_PART('day',acquisition_time)
ORDER BY nonbreeding_data_animals_id,activity_sensors_code ASC
) AS lfct
FROM 
analysis.nb_60437
)i
WHERE 
DATE_PART('hour',nb_60437.acquisition_time) BETWEEN 11 AND 23 AND 
nb_60437.activity_x < 15 OR nb_60437.activity_y < 15;

0 个答案:

没有答案