我有一个看起来像这样的数据库:
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语句。
感谢任何帮助。
答案 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)
的聚类能够产生最好的结果,但是否对你的用例来说是否可行取决于在表中添加或删除行的频率。