sqlite中的复杂过滤器

时间:2016-12-12 10:38:15

标签: sqlite

我有一个看起来像这样的数据库:

No.     |Item   |Fx         |Fy         |Fxy
-------------------------------------------------
1       |a      |1.865      |-2.650     |-1.982
2       |a      |0.816      |-2.742     |-1.287
3       |a      |1.779      |-3.366     |-2.188
4       |b      |-0.367     |-0.229     |2.243
5       |b      |-0.413     |0.736      |1.889
6       |c      |-1.150     |0.150      |1.637
7       |c      |-1.817     |-1.003     |3.429

我想要的是应用比较过滤器,必须执行以下操作(伪代码):

for each distinct item "k":
    go through all rows with "k" and:
      remove row "i" if row "j" exists with: Fx_j < Fx_i AND Fy_j < Fy_i AND abs(Fxy_j) > abs(Fxy_i)

对上面给出的样品应用上述过滤器将产生以下结果:

No.     |Item   |Fx         |Fy         |Fxy
-----------------------------------------------
1       |a      |1.865      |-2.650     |-1.982  <-- leaves due to 3
2       |a      |0.816      |-2.742     |-1.287  <--survives
3       |a      |1.779      |-3.366     |-2.188  <--survives
4       |b      |-0.367     |-0.229     |2.243   <--survives
5       |b      |-0.413     |0.736      |1.889   <--survives
6       |c      |-1.150     |0.150      |1.637   <-- leaves due to 7
7       |c      |-1.817     |-1.003     |3.429   <--survives

我的过滤器是在Python atm中实现的。我正在查询数据库(SELECT * FROM table GROUP BY Item)然后我会过滤结果。

我的方法存在的问题是,由于数据库有几个GB,所以需要很长时间。我想知道是否存在一种更好的方法,最好只包含一个可能复杂的sqlite语句。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

以下SQL查询似乎可以执行您想要的操作。

SELECT t.No, t.Item, t.Fx, t.Fy, t.Fxy FROM data_table t
EXCEPT
SELECT a.No, a.Item, a.Fx, a.Fy, a.Fxy FROM
  data_table a
  INNER JOIN data_table b ON b.Item = a.Item AND a.No <> b.No
    AND b.Fx < a.Fx
    AND b.Fy < a.Fy
    AND ABS(b.Fxy) > ABS(a.Fxy)

文档:SQLite Compound Select Statements

可能会对数据的索引方式产生影响。尝试使用不同的聚簇索引。直觉上我希望(Item, No)的聚类能够产生最好的结果,但是否对你的用例来说是否可行取决于在表中添加或删除行的频率。