Last active
September 15, 2021 09:26
-
-
Save giacope/fa44ab58184a6b406b1a5286453a4e85 to your computer and use it in GitHub Desktop.
Ordered Funnel with Ahoy and ActiveRecord CTE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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