CLAUDE: Fix GROUP BY queries for PostgreSQL compatibility
- Refactor get_batting_totals() to conditionally build SELECT fields based on group_by parameter - Refactor get_pitching_totals() with same pattern - Ensures all non-aggregated SELECT fields are included in GROUP BY clause - Based on successful Major Domo migration pattern
This commit is contained in:
parent
f6e8aa7108
commit
1517283114
@ -339,53 +339,85 @@ async def get_batting_totals(
|
||||
if week is not None:
|
||||
season_games = season_games.where(StratGame.week << week)
|
||||
|
||||
# Build SELECT fields conditionally based on group_by to satisfy PostgreSQL's
|
||||
# strict GROUP BY requirement (all non-aggregated SELECT fields must be in GROUP BY)
|
||||
base_select_fields = [
|
||||
fn.SUM(StratPlay.pa).alias('sum_pa'),
|
||||
fn.SUM(StratPlay.ab).alias('sum_ab'),
|
||||
fn.SUM(StratPlay.run).alias('sum_run'),
|
||||
fn.SUM(StratPlay.hit).alias('sum_hit'),
|
||||
fn.SUM(StratPlay.rbi).alias('sum_rbi'),
|
||||
fn.SUM(StratPlay.double).alias('sum_double'),
|
||||
fn.SUM(StratPlay.triple).alias('sum_triple'),
|
||||
fn.SUM(StratPlay.homerun).alias('sum_hr'),
|
||||
fn.SUM(StratPlay.bb).alias('sum_bb'),
|
||||
fn.SUM(StratPlay.so).alias('sum_so'),
|
||||
fn.SUM(StratPlay.hbp).alias('sum_hbp'),
|
||||
fn.SUM(StratPlay.sac).alias('sum_sac'),
|
||||
fn.SUM(StratPlay.ibb).alias('sum_ibb'),
|
||||
fn.SUM(StratPlay.gidp).alias('sum_gidp'),
|
||||
fn.SUM(StratPlay.sb).alias('sum_sb'),
|
||||
fn.SUM(StratPlay.cs).alias('sum_cs'),
|
||||
fn.SUM(StratPlay.bphr).alias('sum_bphr'),
|
||||
fn.SUM(StratPlay.bpfo).alias('sum_bpfo'),
|
||||
fn.SUM(StratPlay.bp1b).alias('sum_bp1b'),
|
||||
fn.SUM(StratPlay.bplo).alias('sum_bplo'),
|
||||
fn.SUM(StratPlay.wpa).alias('sum_wpa'),
|
||||
fn.SUM(StratPlay.re24).alias('sum_re24'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4)).alias('count_lo1'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4)).alias('count_lo2'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4)).alias('count_lo3'),
|
||||
fn.COUNT(StratPlay.on_first).filter(StratPlay.on_first.is_null(False)).alias('count_runner1'),
|
||||
fn.COUNT(StratPlay.on_second).filter(StratPlay.on_second.is_null(False)).alias('count_runner2'),
|
||||
fn.COUNT(StratPlay.on_third).filter(StratPlay.on_third.is_null(False)).alias('count_runner3'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo1_3out'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo2_3out'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo3_3out')
|
||||
]
|
||||
|
||||
# Add non-aggregated fields based on grouping type
|
||||
if group_by in ['player', 'playerteam', 'playergame', 'playergtype', 'playerteamgtype']:
|
||||
base_select_fields.insert(0, StratPlay.batter)
|
||||
if group_by in ['team', 'playerteam', 'teamgame', 'playerteamgtype']:
|
||||
base_select_fields.append(StratPlay.batter_team)
|
||||
if group_by in ['playergame', 'teamgame']:
|
||||
base_select_fields.append(StratPlay.game)
|
||||
|
||||
bat_plays = (
|
||||
StratPlay
|
||||
.select(StratPlay.batter, StratPlay.game, fn.SUM(StratPlay.pa).alias('sum_pa'),
|
||||
fn.SUM(StratPlay.ab).alias('sum_ab'), fn.SUM(StratPlay.run).alias('sum_run'),
|
||||
fn.SUM(StratPlay.hit).alias('sum_hit'), fn.SUM(StratPlay.rbi).alias('sum_rbi'),
|
||||
fn.SUM(StratPlay.double).alias('sum_double'), fn.SUM(StratPlay.triple).alias('sum_triple'),
|
||||
fn.SUM(StratPlay.homerun).alias('sum_hr'), fn.SUM(StratPlay.bb).alias('sum_bb'),
|
||||
fn.SUM(StratPlay.so).alias('sum_so'), StratPlay.batter_team,
|
||||
fn.SUM(StratPlay.hbp).alias('sum_hbp'), fn.SUM(StratPlay.sac).alias('sum_sac'),
|
||||
fn.SUM(StratPlay.ibb).alias('sum_ibb'), fn.SUM(StratPlay.gidp).alias('sum_gidp'),
|
||||
fn.SUM(StratPlay.sb).alias('sum_sb'), fn.SUM(StratPlay.cs).alias('sum_cs'),
|
||||
fn.SUM(StratPlay.bphr).alias('sum_bphr'), fn.SUM(StratPlay.bpfo).alias('sum_bpfo'),
|
||||
fn.SUM(StratPlay.bp1b).alias('sum_bp1b'), fn.SUM(StratPlay.bplo).alias('sum_bplo'),
|
||||
fn.SUM(StratPlay.wpa).alias('sum_wpa'), fn.SUM(StratPlay.re24).alias('sum_re24'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4)).alias('count_lo1'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4)).alias('count_lo2'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4)).alias('count_lo3'),
|
||||
fn.COUNT(StratPlay.on_first).filter(StratPlay.on_first.is_null(False)).alias('count_runner1'),
|
||||
fn.COUNT(StratPlay.on_second).filter(StratPlay.on_second.is_null(False)).alias('count_runner2'),
|
||||
fn.COUNT(StratPlay.on_third).filter(StratPlay.on_third.is_null(False)).alias('count_runner3'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo1_3out'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo2_3out'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo3_3out')
|
||||
# fn.COUNT(StratPlay.on_first).filter(StratPlay.on_first.is_null(False) &
|
||||
# (StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_runner1_3out'),
|
||||
# fn.COUNT(StratPlay.on_second).filter(StratPlay.on_second.is_null(False) &
|
||||
# (StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_runner2_3out'),
|
||||
# fn.COUNT(StratPlay.on_third).filter(StratPlay.on_third.is_null(False) &
|
||||
# (StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_runner3_3out')
|
||||
)
|
||||
.select(*base_select_fields)
|
||||
.where((StratPlay.game << season_games) & (StratPlay.batter.is_null(False)))
|
||||
.having(fn.SUM(StratPlay.pa) >= min_pa)
|
||||
)
|
||||
|
||||
# Build run_plays SELECT fields conditionally
|
||||
run_select_fields = [
|
||||
fn.SUM(StratPlay.sb).alias('sum_sb'),
|
||||
fn.SUM(StratPlay.cs).alias('sum_cs'),
|
||||
fn.SUM(StratPlay.pick_off).alias('sum_pick'),
|
||||
fn.SUM(StratPlay.wpa).alias('sum_wpa'),
|
||||
fn.SUM(StratPlay.re24).alias('sum_re24')
|
||||
]
|
||||
|
||||
if group_by in ['player', 'playerteam', 'playergame', 'playergtype', 'playerteamgtype']:
|
||||
run_select_fields.insert(0, StratPlay.runner)
|
||||
if group_by in ['team', 'playerteam', 'teamgame', 'playerteamgtype']:
|
||||
run_select_fields.append(StratPlay.runner_team)
|
||||
if group_by in ['playergame', 'teamgame']:
|
||||
run_select_fields.append(StratPlay.game)
|
||||
|
||||
run_plays = (
|
||||
StratPlay
|
||||
.select(StratPlay.runner, StratPlay.runner_team, fn.SUM(StratPlay.sb).alias('sum_sb'),
|
||||
fn.SUM(StratPlay.cs).alias('sum_cs'), fn.SUM(StratPlay.pick_off).alias('sum_pick'),
|
||||
fn.SUM(StratPlay.wpa).alias('sum_wpa'), fn.SUM(StratPlay.re24).alias('sum_re24'))
|
||||
.select(*run_select_fields)
|
||||
.where((StratPlay.game << season_games) & (StratPlay.runner.is_null(False)))
|
||||
)
|
||||
|
||||
@ -642,40 +674,66 @@ async def get_pitching_totals(
|
||||
(StratGame.away_manager_id << manager_id) | (StratGame.home_manager_id << manager_id)
|
||||
)
|
||||
|
||||
# Build SELECT fields conditionally based on group_by to satisfy PostgreSQL's
|
||||
# strict GROUP BY requirement (all non-aggregated SELECT fields must be in GROUP BY)
|
||||
pit_select_fields = [
|
||||
fn.SUM(StratPlay.pa).alias('sum_pa'),
|
||||
fn.SUM(StratPlay.ab).alias('sum_ab'),
|
||||
fn.SUM(StratPlay.run).alias('sum_run'),
|
||||
fn.SUM(StratPlay.hit).alias('sum_hit'),
|
||||
fn.SUM(StratPlay.rbi).alias('sum_rbi'),
|
||||
fn.SUM(StratPlay.double).alias('sum_double'),
|
||||
fn.SUM(StratPlay.triple).alias('sum_triple'),
|
||||
fn.SUM(StratPlay.homerun).alias('sum_hr'),
|
||||
fn.SUM(StratPlay.bb).alias('sum_bb'),
|
||||
fn.SUM(StratPlay.so).alias('sum_so'),
|
||||
fn.SUM(StratPlay.wpa).alias('sum_wpa'),
|
||||
fn.SUM(StratPlay.hbp).alias('sum_hbp'),
|
||||
fn.SUM(StratPlay.sac).alias('sum_sac'),
|
||||
fn.SUM(StratPlay.ibb).alias('sum_ibb'),
|
||||
fn.SUM(StratPlay.gidp).alias('sum_gidp'),
|
||||
fn.SUM(StratPlay.sb).alias('sum_sb'),
|
||||
fn.SUM(StratPlay.cs).alias('sum_cs'),
|
||||
fn.SUM(StratPlay.bphr).alias('sum_bphr'),
|
||||
fn.SUM(StratPlay.bpfo).alias('sum_bpfo'),
|
||||
fn.SUM(StratPlay.bp1b).alias('sum_bp1b'),
|
||||
fn.SUM(StratPlay.bplo).alias('sum_bplo'),
|
||||
fn.SUM(StratPlay.wild_pitch).alias('sum_wp'),
|
||||
fn.SUM(StratPlay.balk).alias('sum_balk'),
|
||||
fn.SUM(StratPlay.outs).alias('sum_outs'),
|
||||
fn.SUM(StratPlay.e_run).alias('sum_erun'),
|
||||
fn.SUM(StratPlay.re24).alias('sum_re24'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4)).alias('count_lo1'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4)).alias('count_lo2'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4)).alias('count_lo3'),
|
||||
fn.COUNT(StratPlay.on_first).filter(StratPlay.on_first.is_null(False)).alias('count_runner1'),
|
||||
fn.COUNT(StratPlay.on_second).filter(StratPlay.on_second.is_null(False)).alias('count_runner2'),
|
||||
fn.COUNT(StratPlay.on_third).filter(StratPlay.on_third.is_null(False)).alias('count_runner3'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo1_3out'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo2_3out'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo3_3out')
|
||||
]
|
||||
|
||||
# Add non-aggregated fields based on grouping type
|
||||
if group_by in ['player', 'playerteam', 'playergame', 'playergtype', 'playerteamgtype']:
|
||||
pit_select_fields.insert(0, StratPlay.pitcher)
|
||||
if group_by in ['team', 'playerteam', 'teamgame', 'playerteamgtype']:
|
||||
pit_select_fields.append(StratPlay.pitcher_team)
|
||||
if group_by in ['playergame', 'teamgame']:
|
||||
pit_select_fields.append(StratPlay.game)
|
||||
|
||||
pit_plays = (
|
||||
StratPlay
|
||||
.select(StratPlay.pitcher, StratPlay.pitcher_team, StratPlay.game, fn.SUM(StratPlay.pa).alias('sum_pa'),
|
||||
fn.SUM(StratPlay.ab).alias('sum_ab'), fn.SUM(StratPlay.run).alias('sum_run'),
|
||||
fn.SUM(StratPlay.hit).alias('sum_hit'), fn.SUM(StratPlay.rbi).alias('sum_rbi'),
|
||||
fn.SUM(StratPlay.double).alias('sum_double'), fn.SUM(StratPlay.triple).alias('sum_triple'),
|
||||
fn.SUM(StratPlay.homerun).alias('sum_hr'), fn.SUM(StratPlay.bb).alias('sum_bb'),
|
||||
fn.SUM(StratPlay.so).alias('sum_so'), fn.SUM(StratPlay.wpa).alias('sum_wpa'),
|
||||
fn.SUM(StratPlay.hbp).alias('sum_hbp'), fn.SUM(StratPlay.sac).alias('sum_sac'),
|
||||
fn.SUM(StratPlay.ibb).alias('sum_ibb'), fn.SUM(StratPlay.gidp).alias('sum_gidp'),
|
||||
fn.SUM(StratPlay.sb).alias('sum_sb'), fn.SUM(StratPlay.cs).alias('sum_cs'),
|
||||
fn.SUM(StratPlay.bphr).alias('sum_bphr'), fn.SUM(StratPlay.bpfo).alias('sum_bpfo'),
|
||||
fn.SUM(StratPlay.bp1b).alias('sum_bp1b'), fn.SUM(StratPlay.bplo).alias('sum_bplo'),
|
||||
fn.SUM(StratPlay.wild_pitch).alias('sum_wp'), fn.SUM(StratPlay.balk).alias('sum_balk'),
|
||||
fn.SUM(StratPlay.outs).alias('sum_outs'), fn.SUM(StratPlay.e_run).alias('sum_erun'),
|
||||
fn.SUM(StratPlay.re24).alias('sum_re24'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4)).alias('count_lo1'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4)).alias('count_lo2'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4)).alias('count_lo3'),
|
||||
fn.COUNT(StratPlay.on_first).filter(StratPlay.on_first.is_null(False)).alias('count_runner1'),
|
||||
fn.COUNT(StratPlay.on_second).filter(StratPlay.on_second.is_null(False)).alias('count_runner2'),
|
||||
fn.COUNT(StratPlay.on_third).filter(StratPlay.on_third.is_null(False)).alias('count_runner3'),
|
||||
fn.COUNT(StratPlay.on_first_final).filter(
|
||||
StratPlay.on_first_final.is_null(False) & (StratPlay.on_first_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo1_3out'),
|
||||
fn.COUNT(StratPlay.on_second_final).filter(
|
||||
StratPlay.on_second_final.is_null(False) & (StratPlay.on_second_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo2_3out'),
|
||||
fn.COUNT(StratPlay.on_third_final).filter(
|
||||
StratPlay.on_third_final.is_null(False) & (StratPlay.on_third_final != 4) &
|
||||
(StratPlay.starting_outs + StratPlay.outs == 3)).alias('count_lo3_3out'))
|
||||
.select(*pit_select_fields)
|
||||
.where((StratPlay.game << season_games) & (StratPlay.pitcher.is_null(False)))
|
||||
.having(fn.SUM(StratPlay.pa) >= min_pa)
|
||||
)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user