Проблема, которую я пытаюсь решить, заключается в том, что у меня есть такая таблица:
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-е наибольшее/наименьшее значение, тогда я мог бы сделать это аналогично тому, как описано выше.
Я использую PostgeSQL.