Postgres CASO en ORDEN AL usar un alias

Tengo la siguiente consulta que funciona muy bien en Postgres 9.1:

SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ORDER BY latest_interaction DESC LIMIT 5; 

Pero lo que quiero hacer es algo como esto:

 SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ORDER BY CASE WHEN( latest_interaction > '2012-09-05 16:05:41.870117') THEN 0 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 2 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 3 ELSE 4 END LIMIT 5; 

Y aparece el siguiente error: ERROR: la columna "latest_interaction" no existe

Parece que no puedo usar el alias para el agregado última_interacción en la cláusula order by con una instrucción CASE.

¿Hay alguna solución para esto?

Intenta envolverlo como una subconsulta:

 SELECT * FROM ( SELECT users.id, GREATEST( COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'), COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117') ) AS latest_interaction FROM users LEFT JOIN messages ON users.id = messages.user_id LEFT JOIN phone_calls ON users.id = phone_calls.user_id GROUP BY users.id ) Sub ORDER BY CASE WHEN( latest_interaction > '2012-09-05 16:05:41.870117') THEN 0 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 2 WHEN(latest_interaction > '2012-09-04 16:05:41.870117') THEN 3 ELSE 4 END LIMIT 5; 

El manual de PG dice la expresión ORDER BY :

Cada expresión puede ser el nombre o el número ordinal de una columna de salida (elemento de list SELECT), o puede ser una expresión arbitraria formada a partir de valores de columna de input.

La solución de sub-consulta de @Mahmoud funcionará, o puede crear la ORDEN BY usando las columnas originales messages.created_at o phone_calls.created_at