Sql 首先,你可能应该先按dateAdded排序,然后按分数排序,以获得排名。此外,问题还不清楚他是否有每一个新分数的记录,或者他们是否在现有行中求和一个新分数;这将改变您的查询bit@beder:但我先按添加日期排序,然后按分数排序(也许你指的是我在宽限期内编
Sql 首先,你可能应该先按dateAdded排序,然后按分数排序,以获得排名。此外,问题还不清楚他是否有每一个新分数的记录,或者他们是否在现有行中求和一个新分数;这将改变您的查询bit@beder:但我先按添加日期排序,然后按分数排序(也许你指的是我在宽限期内编,sql,sql-server-2008,Sql,Sql Server 2008,首先,你可能应该先按dateAdded排序,然后按分数排序,以获得排名。此外,问题还不清楚他是否有每一个新分数的记录,或者他们是否在现有行中求和一个新分数;这将改变您的查询bit@beder:但我先按添加日期排序,然后按分数排序(也许你指的是我在宽限期内编辑的第一个版本)。啊,对不起,我认为在我评论时没有刷新。这是一个很好的答案,但不是我想要的,因为我没有正确描述问题。当团队的综合得分达到阈值时,而不是当团队中的某个人成功得分超过阈值时,我是在寻找答案。虽然这会起作用,但您需要重新计算列的可能时
首先,你可能应该先按dateAdded排序,然后按分数排序,以获得排名。此外,问题还不清楚他是否有每一个新分数的记录,或者他们是否在现有行中求和一个新分数;这将改变您的查询bit@beder:但我先按添加日期排序,然后按分数排序(也许你指的是我在宽限期内编辑的第一个版本)。啊,对不起,我认为在我评论时没有刷新。这是一个很好的答案,但不是我想要的,因为我没有正确描述问题。当团队的综合得分达到阈值时,而不是当团队中的某个人成功得分超过阈值时,我是在寻找答案。虽然这会起作用,但您需要重新计算列的可能时间,这将是资源密集型的。我正在寻找一个运行一次的解决方案。虽然这会起作用,但您需要重新计算列的时间,这将是资源密集型的。我正在寻找一个一次性解决方案。
DateAdded
Score
Team
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
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
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
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