1

I want a JSON output having the distinct values of a column and also a limited number of rows.

This is the sample table that I have in a Postgres Database:

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

I want to write an SQL query that returns a list of all the unique author names and also every row but with a limit of 3

This is the SQL query that I have so far

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;

This gives me the following output:

{"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}]}

In the above output, the only Authors in the list are James and Alex. However, I want the names of all three authors but still limiting "book_details" to the first three. i.e. I want Amanda to be on the list too.

Basically, this is the output I want:

{"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}]}

How do I get all distinct values of a column and still have a limit on the query?

1 Answer 1

3

here is how you can do it;

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.