在postgresql中实现死区选择

时间:2016-05-02 10:17:32

标签: sql postgresql export-to-csv

我正在开发一个postgresql 9.3数据库,它基本上包含这些时间戳的时间戳和值。问题是我使用以下视图设法删除的数据中有很多重复。此视图删除重复,但也选择重复的第一个和最后一个时间戳。 “IS NULL”比较选择表中的第一个和最后一个值。

CREATE OR REPLACE VIEW viewname AS 
( SELECT timestamp, value
    FROM ( 
    SELECT timestamp,
    value, 
    lag(value) OVER (ORDER BY timestamp asc) as prevValue
    lead(value) OVER (ORDER BY timestamp asc) as nextValue
    FROM tablename) AS selectionName 
    WHERE prevValue != value OR 
    nextValue != value OR 
    prevValue IS NULL OR 
    nextValue IS NULL);

现在,CSV导出出现了另一个问题。为了减少选择的数据量,我必须实现5的死区。意味着要选择的下一个值应该与前一个选定值的最小值不同(不仅仅是表中的前一个值)。如果我得到值1,2,4,-3,4,7,8,7,-1,我想要选择的数字是1,(4),7,(7), - 1。括号中的数字也被存储,因为我需要知道'重复'的最后一个值。

我尝试使用pgscript将先前选择的值存储为变量并插入临时表,但是存储两次值似乎是多余的,并且在处理1500万个值时非常慢。

我也尝试过使用各种JOIN技术,但我无法提出可行的解决方案。

还应该注意,插入时我不能这样做,因为其他进程需要所有值。 你有什么建议我可以这样做吗?

编辑:这是一个简单的pgScript,它填充了一个包含1000个随机值的表,以帮助您入门。它类似于我的实际表格适用:

CREATE TABLE deadbandtable (timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL, value smallint);

SET @max = 1000;
SET @counter = 0;
SET @v = INTEGER(0,10);

WHILE @counter < @max
BEGIN
    INSERT INTO deadbandtable (timestamp, value) VALUES(to_timestamp(@counter), @v);
    SET @counter = @counter + 1;
END

0 个答案:

没有答案