我在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;