Il peut être possible de le faire dans une requête de sélection (éventuellement en utilisant quelque chose comme case when
bien que je ne sois pas sûr que ce soit autorisé dans le order by
clause elle-même, YMMV selon le SGBD) mais c'est rarement une bonne idée d'utiliser des calculs par ligne si vous voulez que votre base de données évolue bien au fur et à mesure que les tables grossissent ("ne pas avoir les performances d'un cochon unijambiste dans une course de chevaux" , comme le dit avec éloquence l'un de nos DBA).
Dans des situations comme celle-ci, je configure une colonne supplémentaire (indexée) pour contenir le maximum et garantir que l'intégrité des données est maintenue en utilisant un déclencheur d'insertion/mise à jour pour forcer cette nouvelle colonne au maximum des trois autres.
Étant donné que la plupart des tables de base de données sont lues beaucoup plus souvent qu'écrites, cela amortit le coût du calcul sur toutes les lectures. Le coût n'est supporté que lorsque les données sont mises à jour et que les requêtes deviennent extrêmement rapides puisque vous commandez sur une seule colonne indexée :
select f1, f2, f3 from t order by fmax desc;