1

我有一张这样的桌子:

+------------+------------------+
|temperature |Date_time_of_data |
+------------+------------------+
| 4.5        |9/15/2007 12:12:12|                  
| 4.56       |9/15/2007 12:14:16|
| 4.44       |9/15/2007 12:16:02|
| 4.62       |9/15/2007 12:18:23|
| 4.89       |9/15/2007 12:21:01|
+------------+------------------+

数据集包含 1000 多条记录,我想检查最小可变性。对于每 30 分钟,如果温度的方差不超过 0.2,我希望将那半小时的所有温度值替换为 NULL。

4

2 回答 2

2

这是一个 SELECT 来获取每条记录的时间段的开始:

SELECT temperature,
       Date_time_of_data, 
       date_trunc('hour', Date_time_of_data)+
       CASE WHEN date_part('minute', Date_time_of_data) >= 30
            THEN interval '30 minutes'
            ELSE interval '0 minutes'
       END as start_of_period
FROM your_table

它将日期截断为小时(2007 年 9 月 15 日 12:12:12 到 2007 年 9 月 15 日 12:12:00),然后如果日期最初超过 30 分钟,则添加 30 分钟。

接下来 - 使用 start_of_period 对结果进行分组并获取每个组的最小值和最大值:

SELECT temperature,
       Date_time_of_data,
       max(Date_time_of_data) OVER (PARTITION BY start_of_period) as max_temp,
       min(Date_time_of_data) OVER (PARTITION BY start_of_period) as min_temp
FROM (previou_select_here)

Next - 过滤掉方差大于 0.2 的记录

SELECT temperature,
       Date_time_of_data
FROM (previou_select_here)
WHERE (max_temp - min_temp) <=0.2

最后更新你的表

UPDATE your_table
SET temperature = NULL
WHERE Date_time_of_data IN (previous_select_here)

您可能需要更正此查询中的一些拼写错误,然后才能正常工作。我还没有测试过它们。如果需要,您可以简化它们。

PS如果您需要过滤掉方差小于 0.2 的数据,您可以简单地从第三个 SELECT 创建一个 VIEW

 WHERE (max_temp - min_temp) > 0.2

并使用 VIEW 代替表。

于 2012-11-18T12:26:01.877 回答
2

这个查询应该做的工作:

with intervals as (
    select
        date_trunc('hour', Date_time_of_data) + interval '30 min' * round(date_part('minute', Date_time_of_data) / 30.0) as valid_interval
    from T
    group by 1
    having var_samp(temperature) > 0.2
)
select * from T
where 
    date_trunc('hour', Date_time_of_data) + interval '30 min' * round(date_part('minute', Date_time_of_data) / 30.0) in (select valid_interval from intervals)

内部查询(标记为区间)返回方差超过 0.2 ( having var_samp(temperature) > 0.2) 的时间。date_trunc ...表达式将 Date_time_of_data 舍入为半小时间隔。

该查询在提供的数据集上不返回任何内容。

create table T (temperature float8, Date_time_of_data timestamp without time zone);
insert into T values 
    (4.5, '2007-9-15 12:12:12'),
    (4.56, '2007-9-15 12:14:16'),
    (4.44, '2007-9-15 12:16:02'),
    (4.62, '2007-9-15 12:18:23'), 
    (4.89, '2007-9-15 12:21:01')
;
于 2012-11-18T12:29:13.640 回答