skip to Main Content

I have two tables with a one-to-many relationship that looks something like this:

CREATE TABLE products (
  id UUID PRIMARY KEY,
  name TEXT
);

CREATE TABLE product_variations (
  id UUID PRIMARY KEY,
  product_id UUID REFERENCES products,
  attribute1 TEXT,
  attribute2 TEXT,
  attribute3 TEXT
);

I’d like to create a view which finds all the attributes that are the same for all variations of a product. I’m guessing it would look something like this:

CREATE VIEW product_shared_attributes AS
  SELECT "product_id", some_aggregator("attribute1"), some_aggregator("attribute_2") 
  FROM product_variations
  GROUP BY "product_id";

What kind of aggregator could I use for this? I would expect it to return the value if all values are the same, and NULL otherwise.

2

Answers


  1. you can use STING_AGG

    CREATE VIEW product_shared_attributes AS
      SELECT "product_id", STRING_AGG ("attribute1"), ',') , STRING_AGG ("attribute21"), ',')
          ,STRING_AGG ("attribute3"), ',')
      FROM product_variations
      GROUP BY "product_id";
    
    Login or Signup to reply.
  2. You could count the number of distinct values:

    CREATE VIEW product_shared_attributes AS
      SELECT product_id,
             CASE WHEN count(DISTINCT attribute1) = 1
                  THEN min(attribute1)
             END AS attribute1,
             CASE WHEN count(DISTINCT attribute_2) = 1
                  THEN min(attribute_2)
             END AS attribute_2,
      FROM product_variations
      GROUP BY product_id;
    

    You could use max instead of min, but you need an aggregate function. The CASE expression results in NULL if none of the conditions apply and there is no ELSE branch.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search