Le problème que j'essaie de résoudre est que j'ai une table comme ceci:SQL - min() obtient la valeur la plus basse, max() la plus haute, et si je veux la 2ème (ou la 5ème ou la nième) valeur la plus basse?
a et b se réfèrent au point sur une table différente. la distance est la distance entre les points.
| 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 |
....
La colonne importante que je recherche est a_id. Si je voulais garder le placard b pour chacun un, je pouvais faire quelque chose comme ceci:
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;
Ce qui me donnerait une table de résultat comme celui-ci:
| id | a_id | b_id | distance | delete |
| 1 | 1 | 1 | 1 | 0 |
| 5 | 2 | 2 | 0.45 | 0 |
....
-à-dire je besoin d'une ligne pour chaque valeur de a_id, et cette ligne doit avoir la plus petite valeur de distance pour chaque a_id.
Cependant, je veux garder les 10 points les plus proches pour chaque a_gid. Je pourrais faire ceci avec une fonction de plpgsql mais je suis curieux de savoir s'il y a une manière plus SQL-y. Min() et max() renvoient le plus petit et le plus grand, s'il y avait une fonction d'agrégat comme nth(), qui renverrait la nième plus grande/plus petite valeur alors je pourrais le faire de la même manière que ci-dessus. J'utilise PostgeSQL.
Postgres n'a pas cette fonction, mais vous êtes sur la bonne voie et votre suggestion m'aide à trouver la réponse. – Rory
Maintenant, dans PostgreSQL 9.1, il y a une fonction rank() dans Window Functions. Voir http://www.postgresql.org/docs/9.1/static/tutorial-window.html – Stefan