如何计算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