Skip to content

Instantly share code, notes, and snippets.

@giacope
Last active September 15, 2021 09:26
Show Gist options
  • Select an option

  • Save giacope/fa44ab58184a6b406b1a5286453a4e85 to your computer and use it in GitHub Desktop.

Select an option

Save giacope/fa44ab58184a6b406b1a5286453a4e85 to your computer and use it in GitHub Desktop.
Ordered Funnel with Ahoy and ActiveRecord CTE
event_1 = 'Landed on product page'
event_2 = 'Added product to card'
event_3 = 'Went to checkout'
ActiveRecord::Base.connection.exec_query(
Ahoy::Event.with(
event_1: Ahoy::Event.select(:visit_id, 'MIN(time) AS step_time')
.where(name: event_1)
.group(1),
event_2: Ahoy::Event.select(:visit_id, 'MIN(time) AS step_time')
.joins('JOIN event_1 ON event_1.visit_id = ahoy_events.visit_id')
.where(name: event_2).where('ahoy_events.time >= event_1.step_time')
.group(1),
event_3: Ahoy::Event.select(:visit_id, 'MIN(time) AS step_time')
.joins('JOIN event_2 ON event_2.visit_id = ahoy_events.visit_id')
.where(name: 'Attempted subscription').where('ahoy_events.time >= event_2.step_time')
.group(1),
all_events: Arel::Nodes::Union.new(
Arel::Table.new(:event_1).project("'#{event_1}' AS step_name", 'visit_id'),
Arel::Nodes::Union.new(
Arel::Table.new(:event_2).project("'#{event_2}' AS step_name", 'visit_id'),
Arel::Table.new(:event_3).project("'#{event_3}' AS step_name", 'visit_id')
)
)
)
.select(:step_name, 'COUNT(visit_id)').from('all_events').group(1).to_sql
).to_ary
# [
# {"step_name"=>"Landed on product page", "count"=>123},
# {"step_name"=>"Added product to card", "count"=>84},
# {"step_name"=>"Went to checkout", "count"=>43}
# ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment