Je me demande si la bibliothèque python
sqlite3
prend en charge la fonction RANK ().
Lorsque j'exécute une requête via le navigateur Sqlite
en ligne cela fonctionne bien, mais via python
cela échoue.
File "xyz.py", line 509, in createData conn.execute('SELECT RANK() OVER ( ORDER BY dateAndTime) FROM xyz;') sqlite3.OperationalError: near "(": syntax error
Merci d'avance!
3 Réponses :
Je ne sais pas si la version de SQLite que votre script Python utilise prend en charge RANK ()
. En supposant que ce n'est pas le cas, voici une requête que vous pouvez utiliser comme solution de contournement:
SELECT (SELECT COUNT(*) + 1 FROM yourTable t2 WHERE t2.id < t1.id) rnk FROM yourTable t1 ORDER BY dateAndTime;
Nous pouvons utiliser une sous-requête corrélée pour gérer la logique de classement. Notez que pour DENSE_RANK
, la solution de contournement n'est peut-être pas si simple.
Voici une démo montrant que ma logique et RANK
se comportent de la même manière.
Comment cela aide-t-il si la lib ne prend pas en charge le rang?
@ user2532072 Désolé, j'ai collé la mauvaise requête dans la réponse. Vérifiez la réponse ou la démo mise à jour.
Une autre alternative consiste à utiliser row_number () à la place:
ORDER BY DESC # or ASC
combiné avec croissant (ASC) ou décroissant (DESC) pour obtenir un classement trié
row_number()
Je suis d'accord que cela fonctionnerait pour mon exemple de test, mais mon cas réel doit être classé
Shawn a fait remarquer que ma bibliothèque était trop ancienne. Br
Sqlite a des fonctions de fenêtre dans la version 3.25, vous devez donc l'utiliser ou une version plus récente.
avez-vous essayé de supprimer le ";" à la fin de l'instruction de requête? Je pense qu'il ne devrait pas y avoir de problème avec rank () via python. jetez un œil ici sebastianraschka.com/Articles/… car cela pourrait aider
Sqlite a des fonctions de fenêtre dans 3.25, vous devez donc l'utiliser ou une version plus récente.
Oui, ma bibliothèque est la version 3.22. Merci pour votre aide @Shawn
github.com/coleifer/pysqlite3