Mise à jour des N premières valeurs à l'aide de PostgreSQL
Je veux mettre à jour le top 10 des valeurs d'une colonne dans le tableau. J'ai trois colonnes; id
, account
et accountrank
. Pour obtenir le top 10 des valeurs que je peut utiliser les éléments suivants:
SELECT * FROM accountrecords
ORDER BY account DESC
LIMIT 10;
Ce que je voudrais faire est de définir la valeur dans accountrank
à une série de 1 - 10
, basées sur l'ampleur de account
. Est-ce possible de le faire dans PostgreSQL?
- Si votre poatgres version 8.4 ou plus, vous pouvez utiliser les fonctions de fenêtrage + rang() ou la fonction row_number().
Vous devez vous connecter pour publier un commentaire.
Rejoindre dans une expression de table est généralement plus rapide que les sous-requêtes corrélées. Il est également plus courte.
Avec le la fenêtre de la fonction
row_number()
distinctes numéros sont garantis. Utilisationrank()
(ou peut-êtredense_rank()
) si vous souhaitez que les lignes avec des valeurs égales pouraccount
partagent le même nombre.Seulement si il peut être
NULL
valeurs dansaccount
, vous devez ajouterNULL DERNIER
pour l'ordre de tri décroissant, ouNULL
valeurs de tri sur le dessus:Si il peut être simultané d'accès en écriture, la requête ci-dessus est soumis à une condition de course. Considérer:
Toutefois, si c'était le cas, l'ensemble du concept de coder en dur le top dix serait douteuse approche pour commencer.
Utiliser une expression de table commune au lieu d'un simple sous-requête (comme je l'avais d'abord) pour faire respecter les
LIMIT
de manière fiable. Voir les liens ci-dessus.Sûr, vous pouvez utiliser l'instruction select dans une sous-requête. Générer de l'ordre d'apparition n'est pas trivial, mais voici au moins une façon de le faire. Je n'ai pas testé, mais sur le dessus de ma tête:
C'est le caprice que si deux enregistrements ont la même valeur pour
account
, puis ils recevront le même rang. Vous pourriez envisager une fonctionnalité... 🙂