我读过,可以通过创造性地使用连接等来实现在 SQL 窗口函数中可以执行的任何操作,但我不知道如何实现。我在这个项目中使用 SQLite,它目前没有窗口函数。
我有一个有四列的表:
CREATE TABLE foo (
id INTEGER PRIMARY KEY,
x REAL NOT NULL,
y REAL NOT NULL,
val REAL NOT NULL,
UNIQUE(x,y));
以及一个返回两点之间距离的便捷函数 DIST(x1, y1, x2, y2)。
我想要的是:对于该表中的每一行,我希望同一表中的整行在一定距离内 [例如 25 公里],具有最低的“val”。对于具有相同“val”的行,我想使用最小距离作为平局断路器。
我当前的解决方案是运行 n+1 查询,它可以工作,但很糟糕:
SELECT * FROM foo;
...然后,对于返回的每一行,我运行[其中“src”是我刚刚得到的行]:
SELECT * FROM foo
WHERE DIST(foo.x, foo.y, src.x, src.y)<25
ORDER BY val ASC, DIST(foo.x, foo.y, src.x, src.y) ASC
LIMIT 1
但我真的希望它在一个查询中,部分是出于我自己的兴趣,部分是因为它使我可以更轻松地使用我拥有的其他一些工具。