Skip to content

Instantly share code, notes, and snippets.

@momer
Created December 18, 2013 20:53
Show Gist options
  • Save momer/8029672 to your computer and use it in GitHub Desktop.
Save momer/8029672 to your computer and use it in GitHub Desktop.
Large custom query in postgreSQL for a Rails app
def moderate_plus_vigorous_durations_adjusted(start_date=(1.week.ago.beginning_of_day), end_date=(DateTime.now))
query_args = [{value: self.id}, {value: start_date}, {value: end_date}]
sql = %Q[
WITH my_vars(intensity_2_duration, intensity_3_duration) AS (VALUES
(
(SELECT SUM(duration) as intensity_2_duration
FROM users
INNER JOIN workouts
ON workouts.user_id = users.id
WHERE
workouts.intensity = 2
AND
workouts.deleted_at IS NULL
AND
workouts.date > $2
AND
workouts.date < $3
AND
users.id = $1::int),
(SELECT (SUM(duration)*2) as intensity_3_duration
FROM users
INNER JOIN workouts
ON workouts.user_id = users.id
WHERE
workouts.intensity = 3
AND
workouts.deleted_at IS NULL
AND
workouts.date > $2
AND
workouts.date < $3
AND
users.id = $1::int)
)
)
SELECT MAX(date), (SELECT (COALESCE(intensity_2_duration,0) + COALESCE(intensity_3_duration, 0)) FROM my_vars) as total_duration, SUM(duration)
FROM workouts
INNER JOIN users on users.id = workouts.user_id
WHERE
workouts.deleted_at IS NULL
AND
workouts.date > $2
AND
workouts.date < $3
AND workouts.user_id = $1::int;
]
ActiveRecord::Base.connection.raw_connection.exec(sql, query_args)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment