Проблема, которую я пытаюсь решить, состоит в том, что у меня есть такая таблица:
a и b относятся к точке в другой таблице. расстояние - это расстояние между точками.
| 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. Если бы я хотел сохранить шкаф b для каждого a, я мог бы сделать что-то вроде этого:
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.
Однако я хочу сохранить 10 ближайших пунктов для каждого a_gid. Я мог бы сделать это с помощью функции plpgsql, но мне любопытно, если есть более SQL-у способ.
min () и max () возвращают наименьшее и наибольшее, если бы существовала агрегатная функция, такая как nth (), которая бы возвращала n-е наибольшее / наименьшее значение, тогда я мог бы сделать это аналогично приведенному выше. 1016 *
Я использую PostgeSQL.