我已经读过,可以在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 km],最低的" val&#34 ;。对于具有相同" val"的行,我想使用最低距离作为平局。
我目前的解决方案是运行n + 1个查询,但是很有效:
SELECT * FROM foo;
...然后,对于返回的每一行,我运行[where" 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
但我真的想在一个查询中,部分是为了我自己的兴趣,部分是因为它使我更容易使用其他一些工具。
答案 0 :(得分:0)
使用您的查询获取所需行的ID,然后使用它来加入表:
SELECT *
FROM (SELECT foo.*,
(SELECT id
FROM (SELECT id,
x,
y,
foo.x AS foo_x,
foo.y AS foo_y,
val
FROM foo)
WHERE DIST(foo_x, foo_y, x, y) < 25
ORDER BY val, DIST(foo_x, foo_y, x, y)
LIMIT 1
) AS id2
FROM foo)
JOIN foo AS foo2 ON id2 = foo2.id;