diff --git a/api/queries/nova/batting_campaign_wins.sql b/api/queries/nova/batting_campaign_wins.sql new file mode 100644 index 00000000..4b8f0011 --- /dev/null +++ b/api/queries/nova/batting_campaign_wins.sql @@ -0,0 +1,33 @@ +WITH bot_atbat_results AS ( + SELECT + label_data -> 'args' ->> 'atBatID' as atbat_id, + label_data -> 'args' ->> 'batterAddress' as batter_address, + label_data -> 'args' ->> 'batterTokenID' as batter_token_id, + label_data -> 'args' ->> 'pitcherAddress' as pitcher_address, + label_data -> 'args' ->> 'pitcherTokenID' as pitcher_token_id, + label_data -> 'args' ->> 'outcome' as outcome + FROM + __labels_table__ + WHERE + label_data->>'name' = 'AtBatProgress' + AND address = :fullcount_address + AND label_data -> 'args' ->> 'pitcherAddress' = :bots_address +), +batter_wins AS ( + SELECT + pitcher_token_id, + COUNT(*) as wins + FROM + bot_atbat_results + WHERE + outcome = '6' + AND batter_address = :batter_address + AND batter_token_id = :batter_token_id + AND pitcher_token_id IN :pitcher_token_ids + GROUP BY + pitcher_token_id +) +SELECT + COALESCE(json_agg(json_build_object('token_id', pitcher_token_id, 'wins', wins)), json_build_array()) as wins_against_token_id +FROM + batter_wins \ No newline at end of file diff --git a/api/queries/nova/batting_campaign_wins_old.sql b/api/queries/nova/batting_campaign_wins_old.sql new file mode 100644 index 00000000..4ed32c90 --- /dev/null +++ b/api/queries/nova/batting_campaign_wins_old.sql @@ -0,0 +1,24 @@ + WITH bot_atbat_results AS ( + SELECT + label_data -> 'args' ->> 'atBatID' as atbat_id, + label_data -> 'args' ->> 'batterAddress' as batter_address, + label_data -> 'args' ->> 'batterTokenID' as batter_token_id, + label_data -> 'args' ->> 'pitcherAddress' as pitcher_address, + label_data -> 'args' ->> 'pitcherTokenID' as pitcher_token_id, + label_data -> 'args' ->> 'outcome' as outcome + FROM + __labels_table__ + WHERE + label_data->>'name' = 'AtBatProgress' + AND address = :fullcount_address + AND label_data -> 'args' ->> 'pitcherAddress' = :bots_address + ) + SELECT + COUNT(*) as wins + FROM + bot_atbat_results + WHERE + outcome = '6' + AND bot_atbat_results.batter_address = :batter_address + AND bot_atbat_results.batter_token_id = :batter_token_id + AND bot_atbat_results.pitcher_token_id IN :pitcher_token_ids \ No newline at end of file diff --git a/api/queries/nova/leaderboards/home_run_leaderboard.sql b/api/queries/nova/leaderboards/home_run_leaderboard.sql new file mode 100644 index 00000000..3138af65 --- /dev/null +++ b/api/queries/nova/leaderboards/home_run_leaderboard.sql @@ -0,0 +1,55 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), batter_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_batter_events, + batter_address as batter_address, + batter_token_id as batter_token_id + FROM AtBats + GROUP BY batter_address, batter_token_id + ORDER BY home_runs DESC +) +select + batter_address || '_' || batter_token_id as address, + home_runs as score, + json_build_object( + 'home_runs', home_runs + ) as points_data +from batter_stats \ No newline at end of file diff --git a/api/queries/nova/leaderboards/obp_leaderboard.sql b/api/queries/nova/leaderboards/obp_leaderboard.sql new file mode 100644 index 00000000..ee8fb6e1 --- /dev/null +++ b/api/queries/nova/leaderboards/obp_leaderboard.sql @@ -0,0 +1,61 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), batter_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_batter_events, + batter_address as batter_address, + batter_token_id as batter_token_id + FROM AtBats + GROUP BY batter_address, batter_token_id +), batter_data as ( + SELECT + batter_address || '_' || batter_token_id as address, + 1.0 * (walks + singles + doubles + triples + home_runs) / NULLIF(total_batter_events, 0)::float as obp + FROM batter_stats + WHERE total_batter_events > 9 +) +select + address, + ROUND(obp * 1000)::int as score, + json_build_object( + 'obp', ROUND(obp * 1000) + ) as points_data +from batter_data +ORDER BY obp DESC \ No newline at end of file diff --git a/api/queries/nova/leaderboards/pitching_outs_leaderboard.sql b/api/queries/nova/leaderboards/pitching_outs_leaderboard.sql new file mode 100644 index 00000000..56a95a19 --- /dev/null +++ b/api/queries/nova/leaderboards/pitching_outs_leaderboard.sql @@ -0,0 +1,52 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), pitcher_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' or outcome = '7' THEN 1 ELSE 0 + END) as outs, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + count(*) as total_pitcher_events, + pitcher_address, + pitcher_token_id + FROM AtBats + GROUP BY pitcher_address, pitcher_token_id + ORDER BY outs DESC +) +select + pitcher_address || '_' || pitcher_token_id as address, + outs as score, + json_build_object( + 'outs', outs + ) as points_data +from pitcher_stats \ No newline at end of file diff --git a/api/queries/nova/leaderboards/strikeout_leaderboard.sql b/api/queries/nova/leaderboards/strikeout_leaderboard.sql new file mode 100644 index 00000000..65785ca1 --- /dev/null +++ b/api/queries/nova/leaderboards/strikeout_leaderboard.sql @@ -0,0 +1,55 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), pitcher_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_pitcher_events, + pitcher_address, + pitcher_token_id + FROM AtBats + GROUP BY pitcher_address, pitcher_token_id + ORDER BY strikeouts DESC +) +select + pitcher_address || '_' || pitcher_token_id as address, + strikeouts as score, + json_build_object( + 'strikeouts', strikeouts + ) as points_data +from pitcher_stats \ No newline at end of file diff --git a/api/queries/nova/leaderboards/total_atbats_leaderboard.sql b/api/queries/nova/leaderboards/total_atbats_leaderboard.sql new file mode 100644 index 00000000..b574e15b --- /dev/null +++ b/api/queries/nova/leaderboards/total_atbats_leaderboard.sql @@ -0,0 +1,57 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), batter_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_batter_events, + batter_address as batter_address, + batter_token_id as batter_token_id + FROM AtBats + GROUP BY batter_address, batter_token_id +), batter_data as ( + SELECT + batter_address || '_' || batter_token_id as address, + total_batter_events - walks as at_bats + FROM batter_stats + ORDER BY at_bats DESC +) +select + address, + at_bats as score, + json_build_object( + 'at-bats', at_bats + ) as points_data +from batter_data \ No newline at end of file diff --git a/api/queries/nova/pitch_distribution.sql b/api/queries/nova/pitch_distribution.sql new file mode 100644 index 00000000..5036ecc0 --- /dev/null +++ b/api/queries/nova/pitch_distribution.sql @@ -0,0 +1,50 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), SessionResolved as ( + SELECT + address as contract_address, + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='SessionResolved' +), PitchRevealed as ( + SELECT + address as contract_address, + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->'pitch'-> 1 as pitch_speed, + label_data->'args'->'pitch'-> 2 as pitch_vertical, + label_data->'args'->'pitch'-> 3 as pitch_horizontal, + log_index + FROM dedup_events + WHERE label_data->>'name'='PitchRevealed' +), PitchDistribution as ( + SELECT + pitcher_address || '_' || pitcher_token_id as address, + pitch_speed, + pitch_vertical, + pitch_horizontal, + count(*) as pitch_count + FROM SessionResolved LEFT JOIN PitchRevealed ON (SessionResolved.contract_address=PitchRevealed.contract_address AND SessionResolved.session_id = PitchRevealed.session_id) + GROUP BY pitcher_address, pitcher_token_id, pitch_speed, pitch_vertical, pitch_horizontal + ORDER BY pitch_speed, pitch_vertical, pitch_horizontal +) +SELECT + address, + json_agg(json_build_object( + 'pitch_speed', pitch_speed, + 'pitch_vertical', pitch_vertical, + 'pitch_horizontal', pitch_horizontal, + 'count', pitch_count + )) as pitch_distribution +FROM PitchDistribution +GROUP BY address \ No newline at end of file diff --git a/api/queries/nova/pitching_campaign_wins.sql b/api/queries/nova/pitching_campaign_wins.sql new file mode 100644 index 00000000..a6f30b2f --- /dev/null +++ b/api/queries/nova/pitching_campaign_wins.sql @@ -0,0 +1,66 @@ +WITH atbat_progress_events AS ( + SELECT + label_data -> 'args' ->> 'atBatID' AS atbat_id, + label_data -> 'args' ->> 'outcome' AS outcome, + label_data -> 'args' ->> 'strikes' AS strikes, + label_data -> 'args' ->> 'pitcherAddress' AS pitcher_address, + label_data -> 'args' ->> 'pitcherTokenID' AS pitcher_id, + label_data -> 'args' ->> 'batterAddress' AS batter_address, + label_data -> 'args' ->> 'batterTokenID' AS batter_id + FROM + __labels_table__ + WHERE + label = 'moonworm-alpha' + AND address = :fullcount_address + AND label_data ->> 'name' = 'AtBatProgress' +), +atbat_lengths AS ( + SELECT + atbat_id, + COUNT(*) AS atbat_length + FROM + atbat_progress_events + GROUP BY + atbat_id +), +strikeouts AS ( + SELECT + atbat_id, + pitcher_address, + pitcher_id, + batter_address, + batter_id + FROM + atbat_progress_events + WHERE + outcome = '1' +), +pitcher_wins AS ( + SELECT + strikeouts.atbat_id, + strikeouts.pitcher_address, + strikeouts.pitcher_id, + strikeouts.batter_address, + strikeouts.batter_id + FROM + strikeouts + INNER JOIN atbat_lengths ON strikeouts.atbat_id = atbat_lengths.atbat_id + WHERE + atbat_lengths.atbat_length = 3 +), pitcher_wins_by_id AS ( + SELECT + batter_id, + COUNT(*) AS wins + FROM + pitcher_wins + WHERE + batter_address = :bots_address + AND batter_id IN :batter_token_ids + AND pitcher_address = :pitcher_address + and pitcher_id = :pitcher_token_id + GROUP BY batter_id +) +SELECT + COALESCE(json_agg(json_build_object('token_id', batter_id, 'wins', wins)), json_build_array()) as wins_against_token_id +FROM + pitcher_wins_by_id diff --git a/api/queries/nova/player_stats_atbat.sql b/api/queries/nova/player_stats_atbat.sql new file mode 100644 index 00000000..af666bdf --- /dev/null +++ b/api/queries/nova/player_stats_atbat.sql @@ -0,0 +1,122 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), AtBats as ( + SELECT + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='AtBatProgress' AND label_data->'args'->>'outcome'!='0' +), batter_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_batter_events, + batter_address as batter_address, + batter_token_id as batter_token_id + FROM AtBats + GROUP BY batter_address, batter_token_id +), pitcher_stats as ( + SELECT + SUM(CASE + WHEN outcome = '1' THEN 1 ELSE 0 + END) as strikeouts, + SUM(CASE + WHEN outcome = '2' THEN 1 ELSE 0 + END) as walks, + SUM(CASE + WHEN outcome = '3' THEN 1 ELSE 0 + END) as singles, + SUM(CASE + WHEN outcome = '4' THEN 1 ELSE 0 + END) as doubles, + SUM(CASE + WHEN outcome = '5' THEN 1 ELSE 0 + END) as triples, + SUM(CASE + WHEN outcome = '6' THEN 1 ELSE 0 + END) as home_runs, + SUM(CASE + WHEN outcome = '7' THEN 1 ELSE 0 + END) as in_play_outs, + count(*) as total_pitcher_events, + pitcher_address, + pitcher_token_id + FROM AtBats + GROUP BY pitcher_address, pitcher_token_id +), pitcher_data as ( + select + pitcher_address || '_' || pitcher_token_id as address, + json_build_object( + 'strikeouts', strikeouts, + 'walks', walks, + 'singles', singles, + 'doubles', doubles, + 'triples', triples, + 'home_runs', home_runs, + 'in_play_outs', in_play_outs, + 'innings', (strikeouts + in_play_outs) / 3.0, + 'earned_runs', 1.5 * singles + 2.5 * doubles + 3 * triples + 4 * home_runs, + 'earned_run_average', 9.0 * (1.5 * singles + 2.5 * doubles + 3 * triples + 4 * home_runs) / NULLIF((strikeouts + in_play_outs) / 3.0, 0), + 'whip', (walks + singles + doubles + triples + home_runs) / NULLIF((strikeouts + in_play_outs) / 3.0, 0), + 'batting_average_against', 1.0 * (singles + doubles + triples + home_runs) / NULLIF(total_pitcher_events - walks, 0) + ) as points_data + from pitcher_stats +), batter_data as ( + select + batter_address || '_' || batter_token_id as address, + json_build_object( + 'strikeouts', strikeouts, + 'walks', walks, + 'singles', singles, + 'doubles', doubles, + 'triples', triples, + 'home_runs', home_runs, + 'in_play_outs', in_play_outs, + 'at_bats', total_batter_events - walks, + 'hits', singles + doubles + triples + home_runs, + 'runs_batted_in', walks + 1.5 * singles + 2.5 * doubles + 3 * triples + 4 * home_runs, + 'batting_average', 1.0 * (singles + doubles + triples + home_runs) / NULLIF(total_batter_events - walks, 0), + 'on_base', 1.0 * (walks + singles + doubles + triples + home_runs) / NULLIF(total_batter_events, 0), + 'slugging', (1.0 * singles + 2.0 * doubles + 3.0 * triples + 4.0 * home_runs) / NULLIF(total_batter_events - walks, 0), + 'ops', COALESCE(1.0 * (walks + singles + doubles + triples + home_runs) / NULLIF(total_batter_events, 0), 0) + + COALESCE((1.0 * singles + 2.0 * doubles + 3.0 * triples + 4.0 * home_runs) / NULLIF(total_batter_events - walks, 0), 0) + ) as points_data + from batter_stats +) +select + COALESCE(batter_data.address, pitcher_data.address) as address, + 0 as score, + json_build_object( + 'batting_data', batter_data.points_data, + 'pitching_data', pitcher_data.points_data + ) as points_data +from batter_data full outer join pitcher_data on batter_data.address = pitcher_data.address \ No newline at end of file diff --git a/api/queries/nova/swing_distribution.sql b/api/queries/nova/swing_distribution.sql new file mode 100644 index 00000000..62a734da --- /dev/null +++ b/api/queries/nova/swing_distribution.sql @@ -0,0 +1,50 @@ +with dedup_events as ( + SELECT + DISTINCT ON(transaction_hash, log_index) * + FROM arbitrum_nova_labels + WHERE label='moonworm-alpha' + AND address='0xDfE251B4F12547867ff839bcacec4d159DD68E47' + AND log_index IS NOT NULL +), SessionResolved as ( + SELECT + address as contract_address, + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->>'outcome' as outcome, + label_data->'args'->>'batterAddress' as batter_address, + label_data->'args'->>'batterTokenID' as batter_token_id, + label_data->'args'->>'pitcherAddress' as pitcher_address, + label_data->'args'->>'pitcherTokenID' as pitcher_token_id, + log_index + FROM dedup_events + WHERE label_data->>'name'='SessionResolved' +), SwingRevealed as ( + SELECT + address as contract_address, + label_data->'args'->>'sessionID' as session_id, + label_data->'args'->'swing'-> 1 as swing_type, + label_data->'args'->'swing'-> 2 as swing_vertical, + label_data->'args'->'swing'-> 3 as swing_horizontal, + log_index + FROM dedup_events + WHERE label_data->>'name'='SwingRevealed' +), SwingDistribution as ( + SELECT + batter_address || '_' || batter_token_id as address, + swing_type, + swing_vertical, + swing_horizontal, + count(*) as swing_count + FROM SessionResolved LEFT JOIN SwingRevealed ON (SessionResolved.contract_address=SwingRevealed.contract_address AND SessionResolved.session_id = SwingRevealed.session_id) + GROUP BY batter_address, batter_token_id, swing_type, swing_vertical, swing_horizontal + ORDER BY swing_type, swing_vertical, swing_horizontal +) +SELECT + address, + json_agg(json_build_object( + 'swing_type', swing_type, + 'swing_vertical', swing_vertical, + 'swing_horizontal', swing_horizontal, + 'count', swing_count + )) as swing_distribution +FROM SwingDistribution +GROUP BY address \ No newline at end of file