| |
| |
|
|
| CREATE TABLE IF NOT EXISTS players ( |
| player_id INTEGER PRIMARY KEY, |
| full_name TEXT NOT NULL, |
| first_name TEXT, |
| last_name TEXT, |
| is_active BOOLEAN DEFAULT TRUE |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS teams ( |
| team_id INTEGER PRIMARY KEY, |
| abbreviation TEXT NOT NULL, |
| nickname TEXT, |
| city TEXT, |
| full_name TEXT |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS team_game_logs ( |
| team_id INTEGER NOT NULL, |
| game_id TEXT NOT NULL, |
| season TEXT NOT NULL, |
| season_type TEXT NOT NULL DEFAULT 'Regular Season', |
| game_date DATE NOT NULL, |
| matchup TEXT, |
| wl TEXT, |
| min NUMERIC, |
| fgm INTEGER, fga INTEGER, fg_pct NUMERIC, |
| fg3m INTEGER, fg3a INTEGER, fg3_pct NUMERIC, |
| ftm INTEGER, fta INTEGER, ft_pct NUMERIC, |
| oreb INTEGER, dreb INTEGER, reb INTEGER, |
| ast INTEGER, stl INTEGER, blk INTEGER, tov NUMERIC, pf INTEGER, |
| pts INTEGER, plus_minus NUMERIC, |
| PRIMARY KEY (team_id, game_id) |
| ); |
| CREATE INDEX IF NOT EXISTS idx_tgl_season ON team_game_logs (season, season_type); |
| CREATE INDEX IF NOT EXISTS idx_tgl_date ON team_game_logs (game_date); |
|
|
| CREATE TABLE IF NOT EXISTS player_game_logs ( |
| player_id INTEGER NOT NULL, |
| game_id TEXT NOT NULL, |
| player_name TEXT, |
| team_id INTEGER, |
| team_abbreviation TEXT, |
| season TEXT NOT NULL, |
| season_type TEXT NOT NULL DEFAULT 'Regular Season', |
| game_date DATE NOT NULL, |
| matchup TEXT, |
| wl TEXT, |
| min NUMERIC, |
| fgm INTEGER, fga INTEGER, fg_pct NUMERIC, |
| fg3m INTEGER, fg3a INTEGER, fg3_pct NUMERIC, |
| ftm INTEGER, fta INTEGER, ft_pct NUMERIC, |
| oreb INTEGER, dreb INTEGER, reb INTEGER, |
| ast INTEGER, stl INTEGER, blk INTEGER, tov NUMERIC, pf INTEGER, |
| pts INTEGER, plus_minus NUMERIC, |
| PRIMARY KEY (player_id, game_id) |
| ); |
| CREATE INDEX IF NOT EXISTS idx_pgl_season ON player_game_logs (season, season_type); |
| CREATE INDEX IF NOT EXISTS idx_pgl_player ON player_game_logs (player_id, season); |
| CREATE INDEX IF NOT EXISTS idx_pgl_date ON player_game_logs (game_date); |
|
|
| |
| CREATE TABLE IF NOT EXISTS shots ( |
| game_id TEXT NOT NULL, |
| game_event_id INTEGER NOT NULL, |
| player_id INTEGER NOT NULL, |
| player_name TEXT, |
| team_id INTEGER, |
| season TEXT NOT NULL, |
| season_type TEXT NOT NULL DEFAULT 'Regular Season', |
| game_date DATE, |
| period INTEGER, |
| minutes_remaining INTEGER, |
| seconds_remaining INTEGER, |
| event_type TEXT, |
| action_type TEXT, |
| shot_type TEXT, |
| shot_zone_basic TEXT, |
| shot_zone_area TEXT, |
| shot_zone_range TEXT, |
| shot_distance INTEGER, |
| loc_x INTEGER, |
| loc_y INTEGER, |
| shot_made_flag INTEGER, |
| PRIMARY KEY (game_id, game_event_id) |
| ); |
| CREATE INDEX IF NOT EXISTS idx_shots_player ON shots (player_id, season); |
| CREATE INDEX IF NOT EXISTS idx_shots_team ON shots (team_id, season); |
|
|
| |
| |
| |
| CREATE TABLE IF NOT EXISTS defender_shooting ( |
| season TEXT NOT NULL, |
| player_id INTEGER NOT NULL, |
| player_name TEXT, |
| def_dist_range TEXT NOT NULL, |
| gp INTEGER, |
| fga_frequency NUMERIC, |
| fgm NUMERIC, fga NUMERIC, fg_pct NUMERIC, efg_pct NUMERIC, |
| fg2m NUMERIC, fg2a NUMERIC, fg2_pct NUMERIC, |
| fg3m NUMERIC, fg3a NUMERIC, fg3_pct NUMERIC, |
| PRIMARY KEY (season, player_id, def_dist_range) |
| ); |
|
|
| CREATE TABLE IF NOT EXISTS standings ( |
| season TEXT NOT NULL, |
| team_id INTEGER NOT NULL, |
| team_city TEXT, |
| team_name TEXT, |
| conference TEXT, |
| playoff_rank INTEGER, |
| wins INTEGER, |
| losses INTEGER, |
| win_pct NUMERIC, |
| updated_at TIMESTAMPTZ DEFAULT now(), |
| PRIMARY KEY (season, team_id) |
| ); |
|
|
| |
| CREATE OR REPLACE VIEW player_season_averages AS |
| SELECT |
| player_id, |
| max(player_name) AS player_name, |
| season, |
| count(*) AS gp, |
| avg(min) AS min, |
| avg(pts) AS pts, |
| avg(reb) AS reb, |
| avg(ast) AS ast, |
| avg(stl) AS stl, |
| avg(blk) AS blk, |
| avg(tov) AS tov, |
| avg(fg3m) AS fg3m, |
| avg(plus_minus) AS plus_minus, |
| sum(fgm)::numeric / nullif(sum(fga), 0) AS fg_pct, |
| sum(fg3m)::numeric / nullif(sum(fg3a), 0) AS fg3_pct, |
| sum(ftm)::numeric / nullif(sum(fta), 0) AS ft_pct |
| FROM player_game_logs |
| WHERE season_type = 'Regular Season' |
| GROUP BY player_id, season; |
|
|