J'ai une table TIPS code> défini comme suit:
select * from tips order by (likes - dislikes - (array_length(abuse_history,1) * 5)) ASC limit 2147483647 offset 0
3 Réponses :
Essayez ceci:
WITH popularity_query as ( select t.*, (likes - dislikes - (array_length(abuse_history, 1) * 5)) as popularity from tips t) select * from popularity_query order by popularity
J'ai essayé ceci: Sélectionnez * à partir de (sélectionnez t. *, Aime - n'aime pas - (array_length (abus_history, 1) * 5)) Comme la popularité de TIPS T) Commande par (Popularité) Desc ... Code> et obtenu cette erreur:
Erreur: Erreur de syntaxe à ou proche de la position "de": 99 code>
@Vivri: J'ai suggéré une modification de la réponse de Dave qui attache un nom à la sous-requête, qui devrait corriger l'erreur de syntaxe. Cependant, la sous-requête n'est pas nécessaire pour le problème à la main.
Bien que la sous-requête ne soit pas vraiment nécessaire, comme indiqué par @erwin, il permet une clause d'ordre plus simple. J'ai toujours détesté des calculs répétés dans une clause de commande par ordre.
Il suffit de commander par colonne où la colonne est le numéro de la colonne renvoyée, c'est-à-dire par 2 ASC
Considérez ceci:
tip_id | likes | dislikes | pop | fail_pop --------+-------+----------+-----+---------- 1 | 1 | 0 | 1 | 2 | 1 | 0 | 1 | 4 | 0 | 0 | 0 | 3 | 0 | 1 | -1 | 5 | 1 | 0 | -14 | -14
Merci Erwin. J'ai essayé ce SELECT * de la commande TIPS par (goûts - N'aime pas - Coalece (array_length (abus_history, 1), 0) * 5) ASC code> sans succès.
@Vivri: Peut-être que vous essayez ma démonstration et de rapporter si vous obtenez des résultats différents. De plus, vous avez ASC B> dans votre requête, mais je suppose que vous voulez des descendances.
Merci, votre conseil d'utiliser CoalesCE fonctionne! La raison pour laquelle il n'a pas fonctionné la première fois a d'autres raisons :))
Pour déboguer ceci, mettez la même expression de la clause code> par code> dans la partie code> code>. Examinez ensuite les résultats - sont-ils vraiment ce que vous attendez?
select *, (likes - dislikes - (array_length(abuse_history,1) * 5)) from tips order by (likes - dislikes - (array_length(abuse_history,1) * 5)) ASC limit 2147483647 offset 0
Notez que vous pouvez simplement modifier la commande en «commander par 2» pour commander par la deuxième colonne renvoyée.
* Clarification - Il donne le même ordre de tri, sans aucune salutation de la clé de tri désirée; semble aléatoire.
@Jackmaney - J'ai besoin des résultats triés en fonction de la logique ci-dessus.