不使用窗口函数实现 SQL 查询

2024-05-10

我读过,可以通过创造性地使用连接等来实现在 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

但我真的希望它在一个查询中,部分是出于我自己的兴趣,部分是因为它使我可以更轻松地使用我拥有的其他一些工具。


使用查询获取所需行的 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用窗口函数实现 SQL 查询 的相关文章

随机推荐