2013-01-09 2 views
1

흥미로운 SQL 문제가 있습니다. 몇 가지 제안을 부탁드립니다. 그들이 반드시 (가 시스템 매일 사용하지 않는 경우 일부는 다시 날짜를 기입 할 수있다) 순서가되지 않습니다하지만임계 값에 도달했을 때를 확인하는 SQL 쿼리

DateAdded 
Score 
Team 

사용자가 자신의 점수를 입력합니다 :

은 내가 열이있는 테이블이 있습니다.

팀 점수의 각 구성원이 합쳐져 임계점에 도달 한 팀이 먼저 우승합니다.

어떤 팀이 처음에 어떤 날짜에 도달했는지 알려주는 쿼리를 원합니다.

+0

? 그리고 '연대 측정'점수는 무엇을 의미합니까? 나중에 점수를 언제든지 추가 할 수 있다면 임계 값에 도달했을 때 어떻게 알 수 있습니까? 예를 들어, 팀 A가 수요일에 임계 값을 통과 한 다음 목요일 B 팀은 화요일에 어느 날 전날 전달한 데이터를 입력합니다. 아마도 이것은 당신이 의도 한 바가 아니지만 귀하의 설명이 명확하지 않습니다. – Pondlife

답변

2

를 초과하는 날짜를 기준으로 첫 번째 레코드를 찾을 수 있습니다, 이것은 당신이 원하는 것입니다 달성하기. 이미 시도한 무엇

SELECT TOP 1 T1.Dateadded, T1.Team FROM Table1 T1 
JOIN Table1 T2 
    ON T1.Team = T2.Team 
    and T1.Dateadded >= T2.Dateadded 
GROUP BY T1.Dateadded, T1.Team 
HAVING SUM(T2.Score) >= @Threshold 
ORDER BY T1.Dateadded 

SQL Fiddle

+0

이것은 실제로 제가 한 것입니다 - 정말 고마워요. – Liath

1

DENSE_RANK을 사용하여 임계 값에 도달 한 최상/첫 팀을 결정할 수 있습니다.

WITH CTE AS 
(
    SELECT 
    DateAdded, Score, Team, 
    DENSE_RANK() OVER (Order By DateAdded ASC, Score DESC) AS Rank 
    FROM dbo.TableName 
    WHERE 
    Score >= Threshold 
) 
SELECT 
    DateAdded, Score, Team 
FROM CTE 
WHERE 
    Rank = 1 

여러 팀을 반환 할 수 있습니다.

+0

누가 FIRST의 한계 값에 도달했는지 알고 싶다면 dateAdded와 Score에서 먼저 순위를 정해야합니다. 또한 새로운 점수에 대한 기록이 있는지 또는 기존 행에 새 점수를 더하는 지에 대한 질문이 명확하지 않습니다. 그것은 당신의 WITH 쿼리를 조금 바꿀 것입니다. – beder

+1

@beder :하지만 저는 DateAdded와 Score를 통해 정렬하고 있습니다. (어쩌면 당신은 제가 유예 기간 동안 편집 한 저의 첫 번째 버전을 언급하고있을 것입니다.) –

+0

아, 죄송합니다. 내가 댓글을 달았을 때 새로 고쳐지지 않았다고 생각합니다. – beder

2

필요한 것은 누적 합계입니다. SQL Server 2008은이를 지원하지 않습니다. 좋은 소식은 SQL Server 2012입니다.

그래서, 당신은 상관 하위 쿼리와 함께이 작업을 수행 할 수 있습니다

select team, min(dateadded) as FirstPastThreshold 
from (select dateadded, score, team, 
      (select sum(score) from t t2 where t2.team = t.team and t2.dateadded <= t.dateadded) as cumulativescore 
     from t 
    ) t 
where cumulativescore>= @threshhold 
group by team 
+2

cumscore는 매우 열악한 이름 지정 선택입니다 ...그냥 – beder

0

당신은 currentThresholdScore라는 등 열을 추가 할 수 있습니다. 새로운 레코드가 삽입되면 currentThresholdScore 열은 해당 레코드 Score와 이전 삽입 된 레코드의 값이됩니다. 그런 다음 currentThresholdScore가 메일을 보내기위한 임계 값을 초과하는지 확인하십시오.

+0

라고 말하는 것입니다.이 작업을 수행하는 동안 리소스 집약적 인 열을 다시 계산해야 할 수도 있습니다. 나는 한 번 실행 해본 결과이다. – Liath

0

이 문제에 대해 하위 쿼리를 사용할 수 있습니다. 다만 현재의 점수를 더한 과거 점수의 합을 나열하는 쿼리에 열을 추가 한 다음 임계 값

내가 생각 Sql Fiddle

Use tempdb 
Create Table Scoring (DateAdded DateTime, Score INT, Team INT) 
INSERT Scoring SELECT GetDate(), 100, 1 
INSERT Scoring SELECT GetDate()+1, 150, 1 
INSERT Scoring SELECT GetDate()+1, 50, 2 
INSERT Scoring SELECT GetDate()+2, 75, 2 
INSERT Scoring SELECT GetDate()-10, 75, 2 


DECLARE @Threshhold INT 
SET @Threshhold = 125 

-- Table which includes a cumulative score 
;WITH tbl AS 
(
SELECT 
    Team, 
    DateAdded, 
    Score, 
    -- This column calculates the current score + the sum of past scores 
    IsNull((SELECT Sum(t2.Score) CumScore FROM Scoring t2 WHERE t2.Team = t.Team AND t2.DateAdded < t.DateAdded),0) 
    + Score AS CumScore 
FROM Scoring t 
) 

-- Find first record > threshold 
SELECT TOP 1 * FROM tbl 
WHERE CumScore >= @Threshhold 
ORDER BY DateAdded ASC 
관련 문제