1

興味深い SQL の問題があり、いくつかの提案をいただければ幸いです。

私は列を持つテーブルを持っています:

DateAdded
Score
Team

ユーザーは自分のスコアを入力しますが、必ずしも正しいとは限りません (毎日システムを使用しない場合、スコアが古いものになる場合があります)。

チームのスコアの各メンバーが合計され、しきい値スコアに最初に到達したチームが勝ちます。

どのチームが最初にしきい値に達したか、またその日付を教えてくれるクエリが必要です。

4

5 に答える 5

2

必要なのは累積合計です。また、SQLServer2008はそれをサポートしていません。朗報です。SQLServer2012にはあります。

したがって、相関サブクエリを使用してこれを行うことができます。

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
于 2013-01-09T14:36:54.957 に答える
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 フィドル

于 2013-01-09T15:14:46.877 に答える
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

これにより、複数のチームが返される可能性があることに注意してください。

于 2013-01-09T14:36:45.343 に答える
0

currentThresholdScoreという4番目の列を追加できます。新しいレコードが挿入されるたびに、currentThresholdScore列は、そのレコードのスコアと以前に挿入されたレコードの値になります。次に、currentThresholdScoreがメールなどを送信するためのしきい値を超えているかどうかを確認します。

于 2013-01-09T14:37:18.047 に答える
0

この問題にはサブクエリを使用できます。現在のスコアと過去のスコアの合計をリストするクエリに列を追加し、しきい値を超える日付ごとの最初のレコードを見つけるだけです

SQLフィドル

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
于 2013-01-09T14:50:58.070 に答える