If I have an expensive function call that takes a JSONB and returns an INT, e.g.

```
CREATE FUNCTION my_expensive_function(data JSONB) RETURNS INTEGER AS

```

How do I go about ordering the aggregate result from calling it on a set of JSON data, e.g:

```
SELECT ARRAY_AGG(my_expensive_function(data) ORDER BY ???)
    FROM JSONB_ARRAY_ELEMENTS(json_set) data;

```

I get an error if I try to assign a name to the result:

```
SELECT ARRAY_AGG(my_expensive_function(data) id ORDER BY id)
    FROM JSONB_ARRAY_ELEMENTS(json_set) data;

ERROR:  42601: syntax error at or near "id"
LINE 1: SELECT ARRAY_AGG(my_expensive_function(data) id ORDER BY id)...
                                                 ^
LOCATION:  scanner_yyerror, scan.l:1134

```

I found I can do it by calling the function twice, but I hate that:

```
SELECT ARRAY_AGG(my_expensive_function(data) ORDER BY my_expensive_function(data))
    FROM JSONB_ARRAY_ELEMENTS(json_set) data;

```

I also found that this seems to work, but it is a bit cumbersome also:

```
WITH data_set AS (
    SELECT my_expensive_function(data) AS id
    FROM JSONB_ARRAY_ELEMENTS(json_set) data
) SELECT ARRAY_AGG(id ORDER BY id) FROM data_set;

```

UPDATE: I should have specified - Is there any magic I can do in a single query or do I have to use WITH/subquery? Why can't I add a name to the result of the function?