興味深い SQL の問題があり、いくつかの提案をいただければ幸いです。
私は列を持つテーブルを持っています:
DateAdded
Score
Team
ユーザーは自分のスコアを入力しますが、必ずしも正しいとは限りません (毎日システムを使用しない場合、スコアが古いものになる場合があります)。
チームのスコアの各メンバーが合計され、しきい値スコアに最初に到達したチームが勝ちます。
どのチームが最初にしきい値に達したか、またその日付を教えてくれるクエリが必要です。
興味深い SQL の問題があり、いくつかの提案をいただければ幸いです。
私は列を持つテーブルを持っています:
DateAdded
Score
Team
ユーザーは自分のスコアを入力しますが、必ずしも正しいとは限りません (毎日システムを使用しない場合、スコアが古いものになる場合があります)。
チームのスコアの各メンバーが合計され、しきい値スコアに最初に到達したチームが勝ちます。
どのチームが最初にしきい値に達したか、またその日付を教えてくれるクエリが必要です。
必要なのは累積合計です。また、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
これがあなたが達成したいことだと思います。
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
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
これにより、複数のチームが返される可能性があることに注意してください。
currentThresholdScoreという4番目の列を追加できます。新しいレコードが挿入されるたびに、currentThresholdScore列は、そのレコードのスコアと以前に挿入されたレコードの値になります。次に、currentThresholdScoreがメールなどを送信するためのしきい値を超えているかどうかを確認します。
この問題にはサブクエリを使用できます。現在のスコアと過去のスコアの合計をリストするクエリに列を追加し、しきい値を超える日付ごとの最初のレコードを見つけるだけです
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