PostgreSQL json_agg,并尝试按分组和排序(列必须出现在GROUP BY中)

时间:2018-08-23 03:30:33

标签: postgresql

我已经阅读了一些有关此错误的stackoverflow信息,但我仍然不明白。

-- Returns full JSON document of a user, and all their user_files.
with user_files_json as (
    select user_id,
           json_agg(
             json_build_object(
               'user_file_id', user_file_id,
               's3_key', s3_key,
               'settings', series_settings
             )
           ) as user_files
      from user_files
     where user_id = :user_id
  group by user_id
  order by user_file_id asc
)
select json_build_object(
         'user_id', user_id,
         'user_name', user_name,
         'job_type_name', job_type_name,
         'user_files', user_files
       )
  from user_files_json
  join users using(user_id)
  join job_type using(job_type_id);

我希望文件按其user_file_id顺序列出。就这样。如果我取出order by可以正常工作,但是文件输出顺序错误。

但是我收到一条错误消息:

column "user_files.user_file_id" must appear in the GROUP BY clause or be used in an aggregate function

我所说的Postgresql对我来说是完全合理的,但是有人可以向我解释我在做什么错以及如何解决吗?

2 个答案:

答案 0 :(得分:1)

因此,您想按user_file_id对JSON对象进行排序。您必须首先创建JSON对象,然后对它们进行分组和聚合,因为PostgreSQL仅返回聚合和user_id,并且不能基于聚合中的内容(仅根据结果集中的内容)对它们进行排序。

select user_id,
       json_agg(obj) as user_files
  from (
    select user_id, json_build_object(
           'user_file_id', user_file_id,
           's3_key', s3_key,
           'settings', series_settings
      order by user_file_id asc
         ) as obj
  from user_files
 where user_id = :user_id) tmp
group by user_id

答案 1 :(得分:0)

错误:指定了ORDER BY,但json_build_object不是聚合函数 如果尝试按json_build_object中的特定列进行排序,则会遇到此错误。 而是尝试以下方法,它会起作用

select user_id,
       user_files
  from (
    select user_id, json_agg(json_build_object(
           'user_file_id', user_file_id,
           's3_key', s3_key,
           'settings', series_settings)order by user_file_id asc) as user_files
  from user_files
 where user_id = :user_id) tmp
group by user_id