我要解决的问题是我有一个这样的表:
a 和 b 指的是不同表上的点。 distance 是点之间的距离。
| id | a_id | b_id | distance | delete |
| 1 | 1 | 1 | 1 | 0 |
| 2 | 1 | 2 | 0.2345 | 0 |
| 3 | 1 | 3 | 100 | 0 |
| 4 | 2 | 1 | 1343.2 | 0 |
| 5 | 2 | 2 | 0.45 | 0 |
| 6 | 2 | 3 | 110 | 0 |
....
我要查找的重要列是 a_id。如果我想为每个 a 保留壁橱 b,我可以这样做:
update mytable set delete = 1 from (select a_id, min(distance) as dist from table group by a_id) as x where a_gid = a_gid and distance > dist;
delete from mytable where delete = 1;
这会给我一个这样的结果表:
| id | a_id | b_id | distance | delete |
| 1 | 1 | 1 | 1 | 0 |
| 5 | 2 | 2 | 0.45 | 0 |
....
即每个 a_id 值都需要一行,并且该行应该具有每个 a_id 的最小距离值。
但是我想为每个 a_gid 保留 10 个最接近的点。我可以使用 plpgsql 函数执行此操作,但我很好奇是否有更多 SQL-y 方法。
min() 和 max() 返回最小值和最大值,如果有像 nth() 这样的聚合函数,它会返回第 n 个最大/最小值,那么我可以按照与上述类似的方式执行此操作。
我正在使用 PostgeSQL。
最佳答案
试试这个:
SELECT *
FROM (
SELECT a_id, (
SELECT b_id
FROM mytable mib
WHERE mib.a_id = ma.a_id
ORDER BY
dist DESC
LIMIT 1 OFFSET s
) AS b_id
FROM (
SELECT DISTINCT a_id
FROM mytable mia
) ma, generate_series (1, 10) s
) ab
WHERE b_id IS NOT NULL
在 PostgreSQL 8.3 上检查
关于SQL - min() 获得最低值,max() 获得最高值,如果我想要第二个(或第五个或第 n 个)最低值怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502794/