아래 쿼리를 사용하여 PlayedTo
각각에 대해 두 개의 가장 낮은 결과 를 반환하려고합니다 PlayerID
.
select
x1.PlayerID, x1.RoundID, x1.PlayedTo
from P_7to8Calcs as x1
where
(
select count(*)
from P_7to8Calcs as x2
where x2.PlayerID = x1.PlayerID
and x2.PlayedTo <= x1.PlayedTo
) <3
order by PlayerID, PlayedTo, RoundID;
불행히도 현재 가장 낮은 점수 중 하나에 동점이있을 때 결과를 반환하지 않습니다. 데이터 세트 및 코드의 사본은 여기 http://sqlfiddle.com/#!3/4a9fc/13 입니다.
PlayerID
47은 두 RoundID
번째로 낮은 항목에 대해 두 개의 다른 결과가 있기 때문에 하나의 결과 만 반환됩니다 PlayedTo
. 내가 계산하려는 것은 숫자가 무엇인지 알 필요가 있기 때문에이 두 가지 중 어느 것이 반환되는지는 중요하지 않지만보고를 위해서는 이상적으로는 최신 날짜를 알아야합니다.
쿼리의 또 다른 사소한 문제는 실행하는 데 걸리는 시간입니다. Access에서 83 개의 레코드를 실행하는 데는 약 2 분이 걸리지 만 데이터베이스가 완전히 가동되고 실행되면 약 1000 개의 레코드에서 실행해야합니다.
어떤 도움이라도 대단히 감사하겠습니다.
DatePlayed
내부 정렬 에 추가하여 동점을 해결하십시오 (어쨌든 최신 날짜를 원함).
select
x1.PlayerID, x1.RoundID
, x1.PlayedTo
from P_7to8Calcs as x1
where
(
select count(*)
from P_7to8Calcs as x2
where x2.PlayerID = x1.PlayerID
and (x2.PlayedTo < x1.PlayedTo
or x2.PlayedTo = x1.PlayedTo
and x2.DatePlayed >= x1.DatePlayed
)
) <3
order by PlayerID, PlayedTo, RoundID;
성능을 위해 조인 조건을 지원하는 인덱스를 만듭니다. 다음과 같은 것 :
create index P_7to8Calcs__PlayerID_RoundID on P_7to8Calcs(PlayerId, PlayedTo);
참고 : 여기에는 Acess가 없기 때문에 SQLFiddle을 사용했습니다.
편집 : 인덱스가 성능을 충분히 향상시키지 못하는 경우 창 함수를 사용하여 다음 쿼리를 시도 할 수 있습니다 (중첩 된 하위 쿼리 방지). SQLFiddle에서 작동하지만 이것이 Access에서 지원되는지 확실하지 않습니다.
select x1.PlayerID, x1.RoundID, x1.PlayedTo
from (
select PlayerID, RoundID, PlayedTo
, RANK() OVER (PARTITION BY PlayerId ORDER BY PlayedTo, DatePlayed DESC) AS Rank
from P_7to8Calcs
) as x1
where x1.RANK < 3
order by PlayerID, PlayedTo, RoundID;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다