如何计算sql表中3行(或更多行)内每对之间的差异之和
我有下表如何计算sql表中3行(或更多行)内每对之间的差异之和,sql,sql-server,Sql,Sql Server,我有下表 | Score | AssessmentId| SubmissionId | |:-----------|------------:|:------------:| | 15 | 23 | 18 | | 15 | 24 | 18 | | 15 | 16 | 19 | | 19 | 1
| Score | AssessmentId| SubmissionId |
|:-----------|------------:|:------------:|
| 15 | 23 | 18 |
| 15 | 24 | 18 |
| 15 | 16 | 19 |
| 19 | 17 | 19 |
| 18 | 25 | 19 |
此表包含不同用户的评估分数,这些分数可以从每次提交的评估ID中推断出来。我需要做的是计算每次提交的所有可能分数之间的差异
例如,对于提交18:15-15=0。
提交文件19:19-15+18-15+19-18=8
作为一种选择,我尝试了滞后功能:
PARTITION BY SubmissionId
ORDER BY AssessmentId
) previous_month FROM (
SELECT SUM(CurrentScore) as Score, AssessmentId, SubmissionId
FROM AssessmentItems INNER JOIN dbo.Assessments ON dbo.AssessmentItems.AssessmentId = dbo.Assessments.Id
WHERE IsActive = 1
GROUP BY AssessmentId, SubmissionId) as TBL
产生了:
| Score | AssessmentId| SubmissionId | PrevScore |
|:-----------|------------:|:------------:|:------------:|
| 15 | 23 | 18 | NULL |
| 15 | 24 | 18 | 15 |
| 15 | 16 | 19 | NULL |
| 19 | 17 | 19 | 15 |
| 18 | 25 | 19 | 19 |
从这个表中,我可以得到分数和分数之间的差异,但这仍然不能涵盖所有的可能性。例如,对于提交文件19,将不计算19-18
我想知道是否有人在这里帮助你前进?我想你想要一个自我加入:
WITH a AS (
SELECT SUM(CurrentScore) as Score, AssessmentId, SubmissionId
FROM AssessmentItems ai INNER JOIN
dbo.Assessments a
ON ai.AssessmentId = a.Id
WHERE IsActive = 1
GROUP BY AssessmentId, SubmissionId
)
SELECT a1.SubmissionId, a1.Score, a2.Score,
(a2.Score - a1.Score) as diff
FROM a a1 JOIN
a a2
ON a1.SubmissionId = a2.SubmissionId AND
a1.Score < a2.Score;
我想你想要一个自我加入:
WITH a AS (
SELECT SUM(CurrentScore) as Score, AssessmentId, SubmissionId
FROM AssessmentItems ai INNER JOIN
dbo.Assessments a
ON ai.AssessmentId = a.Id
WHERE IsActive = 1
GROUP BY AssessmentId, SubmissionId
)
SELECT a1.SubmissionId, a1.Score, a2.Score,
(a2.Score - a1.Score) as diff
FROM a a1 JOIN
a a2
ON a1.SubmissionId = a2.SubmissionId AND
a1.Score < a2.Score;
请尝试以下查询:
declare @tbl table ( Score int, AssessmentId int, SubmissionId int);
insert into @tbl values
( 15 , 23 , 18 ),
( 15 , 24 , 18 ),
( 15 , 16 , 19 ),
( 19 , 17 , 19 ),
( 18 , 25 , 19 );
select SubmissionId, sum(Score * recordsCount - scoreSum)
from (
select *,
sum(score) over (partition by SubmissionId order by Score rows between unbounded preceding and 1 preceding) scoreSum,
sum(1) over (partition by SubmissionId order by Score rows between unbounded preceding and 1 preceding) recordsCount
from @tbl
) a where scoreSum is not null
group by SubmissionId
说明:
有了这个公式19-15+18-15+19-18,我们可以将其改写为:
19 * 2 + 18 * 1 - (15 + 18) - 15
第一部分19*2+18*1是分数乘以之前的记录计数
第二部分是前几次的累计得分总和:
15+18代表19
15换18
请尝试以下查询:
declare @tbl table ( Score int, AssessmentId int, SubmissionId int);
insert into @tbl values
( 15 , 23 , 18 ),
( 15 , 24 , 18 ),
( 15 , 16 , 19 ),
( 19 , 17 , 19 ),
( 18 , 25 , 19 );
select SubmissionId, sum(Score * recordsCount - scoreSum)
from (
select *,
sum(score) over (partition by SubmissionId order by Score rows between unbounded preceding and 1 preceding) scoreSum,
sum(1) over (partition by SubmissionId order by Score rows between unbounded preceding and 1 preceding) recordsCount
from @tbl
) a where scoreSum is not null
group by SubmissionId
说明:
有了这个公式19-15+18-15+19-18,我们可以将其改写为:
19 * 2 + 18 * 1 - (15 + 18) - 15
第一部分19*2+18*1是分数乘以之前的记录计数
第二部分是前几次的累计得分总和:
15+18代表19
15换18