仅保留一列最少的行

问题描述

我正在寻找一个sqlite查询,以大大减少数据库中不相关的噪声。 相关表格包含成对的点(“六边形”),以及它们与给出该距离的源之间的距离。我只想保留每一对点中任何源中找到的最小距离的行。

我认为

run

应该大致上做正确的事。 从理论上讲,我可以有不同的行,它们具有相同的hexbin1,hexbin2和距离,但来源不同。实际上,这是不可能的,并且不会妨碍需要使用该数据库的下一个进程,因此可以根据更易于执行的操作将其保留或删除。我在上面的查询中保留了重复项,但在其他条件相同的情况下,我希望保留所有具有最小距离的样本中的任意一个样本。

天真地阅读,在表上迭代了3次,这听起来很不方便。我该怎么做呢?

解决方法

此查询:

SELECT hexbin1,hexbin2,MIN(distance)
FROM dist d
GROUP BY hexbin1,hexbin2

返回hexbin1,hexbin2的每个组合的所有最小距离。
如果没有重复最小距离的情况,您可以像这样使用它:

DELETE FROM dist
WHERE (hexbin1,distance) NOT IN (
  SELECT hexbin1,MIN(distance)
  FROM dist 
  GROUP BY hexbin1,hexbin2
)

查看简化的demo

但是如果有重复项,则借助FIRST_VALUE()窗口功能,平局决胜者可以成为列rowid

DELETE FROM dist
WHERE rowid NOT IN (
  SELECT FIRST_VALUE(rowid) OVER (PARTITION BY hexbin1,hexbin2 ORDER BY distance,rowid)
  FROM dist
)

查看简化的demo

,

您可以尝试:

delete from dist
    where exists (select 1
                  from dest d2
                  where d2.hexbin1 = d.hexbin1 and d2.hexbin2 = d.hexbin2 and d2.distance > d.distance
                 );

尤其是,这可以利用(hexbin1,distance)上的索引。