Combine Different Measures Using SQL Join

Given the following 2 tables:

CREATE TABLE users (
  id integer,
  email varchar
  created_at timestamp
)

CREATE TABLE products (
  id integer,
  name varchar,
  created_at timestamp
)

CREATE TABLE reviews (
  id integer,
  user_id integer,
  product_id integer
  content text,
  created_at timestamp
)

Now, you want to write a query that shows in 1 table, how many new users, new products, new reviews are being added daily.

date_d new_users new_products new_reviews
2017-12-02 571 21 49
2017-12-01 500 30 65

Solution

To perform this, we will:

  • We notice since we only care about daily counts of each metric, each metric has no dependency on each other.
  • Thus it’s most efficient to run the counts individually, and combine them together using the date key

Our final SQL will look like:

with daily_users as (
  select
    created_at::date as date_d,
    count(1) as new_users
  from users
  group by 1
), daily_products as (
  select
    created_at::date as date_d,
    count(1) as new_users
  from users
  group by 1

), daily_reviews as (
  select
    created_at::date as date_d,
    count(1) as new_users
  from users
  group by 1
)

select
  U.date_d,
  U.new_users,
  P.new_products,
  R.new_reviews
from daily_users U, daily_products P, daily_reviews R
where U.date_d = P.date_d
  and U.date_d = R.date_d
order by 1 DESC

Combine measures