如何指定 Postgres 的限制 json_agg

How to specify a limit on Postgres json_agg

我想要一个 JSON 具有不同列值和有限行数的输出。

这是我在 Postgres 数据库中的示例 table:

Name       Author     Copies Sold
----       -------     -----------
Book1      James           10
Book2      James           10
Book3      Alex            12
Book4      James           11
Book5      Amanda          1

我想编写一个 SQL 查询,该查询 returns 所有唯一作者姓名的列表以及每一行,但限制为 3

这是我目前的 SQL 查询

WITH first_query AS(
    SELECT * FROM sample_table LIMIT 3
)
SELECT json_build_object("all_authors",json_agg(DISTINCT(author)),
                         "book_details",json_agg(row_to_json(first_query))
)
FROM first_query;

这给了我以下输出:

{"all_authors":["James","Alex"],
 "book_details":[{"name":"Book1","author":"James","copies sold":10},
                 {"name":"Book2","author":"James","copies sold":10},
                 {"name":"Book3","author":"Alex","copies sold":12}]}

在上面的输出中,列表中仅有的作者是 James 和 Alex。但是,我想要所有三位作者的名字,但仍然将“book_details”限制为前三位。即我也希望阿曼达也在名单上。

基本上,这是我想要的输出:

{"all_authors":["James","Alex", "Amanda"],
 "book_details":[{"name":"Book1","author":"James","copies sold":10},
                 {"name":"Book2","author":"James","copies sold":10},
                 {"name":"Book3","author":"Alex","copies sold":12}]}

如何获取列的所有不同值并且仍然对查询有限制?

这里是你如何做到的;

with cte as (
SELECT * FROM books limit 3
) 
SELECT json_build_object('all_authors',json_agg(DISTINCT(author)),'book_details',(select json_agg(row_to_json(cte.*,true)) from cte))
FROM books