我正在开发一个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