puede ser posible hacerlo en una consulta de selección (posiblemente usando algo como case when
aunque no estoy seguro de que esté permitido en el order by
cláusula en sí misma, YMMV dependiendo del DBMS), pero rara vez es una buena idea usar cálculos por fila si desea que su base de datos se escale bien a medida que las tablas crecen ("no tener el rendimiento de un cerdo con una sola pierna en una carrera de caballos" , como lo expresa con elocuencia uno de nuestros administradores de bases de datos).
En situaciones como esta, configuro una columna adicional (indexada) para contener el máximo y garantizar que la integridad de los datos se mantenga usando un activador de inserción/actualización para forzar esa nueva columna al máximo de las otras tres.
Debido a que la mayoría de las tablas de la base de datos se leen con mucha más frecuencia de lo que se escriben, esto amortiza el costo del cálculo en todas las lecturas. El costo se asume solo cuando los datos se actualizan y las consultas se vuelven increíblemente rápidas ya que está ordenando en una sola columna indexada:
select f1, f2, f3 from t order by fmax desc;