2011-05-15 2 views
2

나는 Lahman Baseball Database의 MySQL 버전을 사용하고 있으며 신참 선수가 잃은 해를 결정하는 데 어려움을 겪고 있습니다. 신인 서 손실 메이저 리그 선수에 대한 규칙은 다음과 같습니다라만 (Lahman) 데이터베이스에서 신년을 결정하기

이전 시즌이나 시즌 동안의 (a) 타석 (130)을 초과, 그는 한 50 이닝은 메이저에서 투구,하지 않는 선수는 신인 간주한다

리그; (b) 25 인승 제한 기간 (군 복무 시간 및 장애인 명단 시간 제외) 동안 메이저 리그 클럽 또는 클럽의 활성 명단에 45 일 이상 축적 된 경우.

Batters와 Pitchers에 대해이 작업을 수행 할 수있는 쿼리가 있습니까? 아니면 프로그래밍 방식으로 수행되는 것이 있습니까?

답변

1

당신이에서 박쥐에 의해 신인 (> 130)와 이닝 투구 (> 50)를 알아낼 수있는 Lahman 데이터베이스 사용은, 그러나 서비스에 대한 아무 것도 존재하지 않습니다 25 남자 명단 (9 월이 아닌) 제한 시간.

이렇게하려면 데이터를 다시 인쇄해야합니다 (http://www.retrosheet.org/game.htm).

아래의 쿼리는 At Bats와 Innings Pitched의 신인을 모두 제공하지만 서비스 시간 신인은 예외입니다. 팀이 MLB 명단에 신인을두고 플레이하지 않는 경향이있는 팀은 소수에 불과합니다. 개발 시간을 상실하고 (게임하지 않음) 통제 된 시간에 잃는 서비스 시간을 단축합니다. 그래서 당신이 행복하다면,이 테이블들이 할 것입니다.

신참 선수를 강조 표시하기 위해 타자 또는 투수와 함께 외부 참조 테이블로 사용할 수 있습니다. 또는 RookieYr 구별을 사용하여 타자와 투수에게 추가 열을 추가 할 수 있습니다 (Lahman DB에 새로운 시즌을 추가하려는 것처럼 조언 - 필요없는 커스터마이징).

/************************************ Create MLB Rookie Xref Table ********************************************** 
-- Sort Out Batters who accumulate 130 AB 
-- Sort Out Pitchers who accumulate 50 IP 
-- Define Rookie Year, Drop off years previous and years after 
-- Can be updated Annually using "player ID not in (select distinct playerID from Xref_RookieYr) 
-- Using the Sean Lahman Database 
-- Authored By Paul DeVos {www.linkedin.com/in/devosp/} 
*****************************************************************************************************************/ 

/****** Query uses T-SQL, Query ran in MS SQL 2012 - you may need to tweek for other platorms or versions. ******/ 

--Step 1 - Run this for hitter accumulated ABs and when Rookie Year (130 Career At Bats) 
Select 
    concat(m.nameFirst, ' ', m.nameLast) as Name, 
    b.PlayerID, 
    b.yearID, 
    m.debut, 
    sum(b.ab) over (partition by b.playerID order by b.playerID, b.yearID) as CumulativeAB, 
    null as CumulativeIP, -- Place Holder for Rookie Pitchers Insert 
    case when sum(b.ab) over (partition by b.playerID order by b.playerID, b.yearID) >= 130 then b.yearID end as RookieYR 
into #temp_rookie_year 
from 
    [master] m 
    inner join Batting b 
    on m.playerID=b.playerID 
-- Selects Position Players 
where b.playerID not in (select distinct f.playerID from Fielding f where f.pos = 'P') 


--Step 2 - Run this to get accumulated IP and Rookie Year (50 Career IP) 
Insert into #temp_rookie_year 
    (
     Name, PlayerID, YearID, Debut, CumulativeAB, CumulativeIP, RookieYR 
    ) 
Select 
    concat(m.nameFirst, ' ', m.nameLast) as Name, 
    p.PlayerID, 
    p.yearID, 
    m.debut, 
    null as CumulativeAB, 
    sum(p.IPouts) over (partition by p.playerID order by p.playerID, p.yearID) as CumulativeIP, 
    case when sum(p.IPouts) over (partition by p.playerID order by p.playerID, p.yearID) >= 150 then p.yearID end as RookieYR 
from [master] m 
    inner join pitching p 
    on m.playerID=p.playerID 
--Chooses Pitchers 
where p.playerID in (select distinct f.playerID from Fielding f where f.pos = 'P') 


--Step 3 Run this - sorts out the rookie year into Rookie Xref Table 
select Name, PlayerID, min(RookieYr) as RookieYear 
into #Xref_RookieYr 
from #temp_rookie_year 
--where name = 'Hank Aaron' 
group by Name, PlayerID 
order by RookieYear desc 

--Step 4 - run IF you want to remove players who never lost rookie status (cup of cofee players, etc - anyone under 130 AB or 50 IP) 
select * from #Xref_RookieYr 
order by playerID 

Still has NUlls in Table

Delete from #Xref_RookieYr where RookieYear is null 


select * from #Xref_RookieYr 
order by playerID 

Doesn't Have Nulls in Table

/***************************************************************************************************************** 
You can change drop the "#" in front of the table (and name it whatever you want) when you want a permanent table. 
If you leave it, it'll drop off when you close the program. e.g. Xref_Rookie_2013 
*****************************************************************************************************************/ 
1

이것은 SQL로 수행 할 수 있습니다. 그것이 이루어지는 방법은 그것을하는 가장 최적의 방법이 무엇인지에 기초 할 것입니다. 대부분의 경우 그렇게 (의사 코드)처럼 하나 개의 쿼리와 함께 할 수있다 : 나는 당신의 데이터베이스의 데이터에 그런 아무것도 찾을 수 없기 때문에 WHERE 문장의 마지막 부분이 약간 불확실하다

SELECT Master.* 
FROM Master 
LEFT JOIN Batting ON Master.player_id = Batting.player_id 
LEFT JOIN Pitching ON Master.player_id = Pitching.player_id 
WHERE Batting.AB > 130 OR Pitching.IPOuts > (50 x 3) 
OR Master.DaysActive > 45 

그건 공급자. 나는 능동적 인 게임을 본다. 그러나 그것은 같은 것이 아니다. Appearances 테이블은 당신을 가까이에 놓을 수는 있지만 당신이 할 수있는 모든 것에 관한 것입니다.

http://baseball1.com/files/database/readme58.txt

내가 (신인 누가 계산 포함)이하고있는 것과 유사한 일을 한 다른 사람을 발견했다 : 여기

내가 떨어져 내 의사 코드를 기반 데이터입니다. 여기 (코드) 자신의 사이트입니다 :

http://baseballsimulator.com/blog/category/database/

+0

나에게 문제를 일으키는 된 한 것은 배팅과 피칭 테이블 내 선수 시즌 세분화되어 있다는 것입니다, 각각의 항목이 아니라 각 선수를위한 단일 시즌.안타깝게도 신인 선수는 2 시즌 이상 (선수 X는 한 시즌에는 40 이닝을, 다음 시즌에는 10 개) 던질 수 있습니다. 피칭 테이블의 모든 플레이어 항목을보고 특정 계절이 만났거나 최소값을 초과했는지 확인하는 방법이 있습니까? – velcronomicon

관련 문제