我有一张表,每分钟都有测量值。第一列是时间,它是我表的主键。这个时间序列没有间隙,所以对于第一行到最后一行的时间跨度,我每分钟都有一组测量值。将此表命名为experiment
。第一次为t_0
,第二次为t_1
,依此类推......
现在,在另一个表bad_values
中,我有一组偶尔出现的错误值(时间也是bad_values
的主键)。
现在我想创建一个视图,比如说filtered
,其中包含以下属性:视图应包含来自experiment
的时间段t_(10*n)
,t_(10*n + 1)
中的数据,...,t(10*[n+1])
长度为10分钟。为了论证,让这样一个块命名为B_n
。如果B_n
中包含t_(10*n)
,...,t(10*[n+1])
的任何时间值,则应从视图中删除块bad_data
。
换句话说:我想过滤掉包含错误数据的时间块。
我的第一次尝试是定义一个功能类似于掩码的表,即包含应该包含在filtered
中的所有时间的表。
如何在SQL中实现这一点(创建这样的掩码),尤其是SQLite3?或者首先使用面具不好的想法?
答案 0 :(得分:1)
要忽略整个博客,您可以使用exists
条件
SELECT * FROM experiment e
WHERE not exists (
SELECT * FROM bad_values b
WHERE ((e.time_value - 1) / 10) == ((b.time_value - 1) / 10)
通过计算`(time_value - 1)/ 10'你得到你想要的类,所以只排除整个类
要获得好时间值,您可以在一个select语句中执行:
select time_value from experiment
except
select time_value from bad_values
这将为您提供所有已过滤的时间值,您可以在其他查询的FROM
中使用此值。或者您可以使用它将所有值插入到新表中,如您所愿。
修改强>
要从实验中删除错误值,您可以简单地使用
delete from experiment where time_value in (select time_value from bad_values)