Select 考虑到时间衰减系数,为特定用户添加分数列的值

Select 考虑到时间衰减系数,为特定用户添加分数列的值,select,group-by,sum,sql-server-2016,row-number,Select,Group By,Sum,Sql Server 2016,Row Number,我在下面的链接中问了一个问题,其中一个成员帮助我解决了大部分问题(计算t列和pre_列分数)。但我需要再计算一列。我在下面的链接中解释了细节 总之,我如何使用t列和pre_列分数计算智力资本列?“智力资本”列考虑所有以前比赛的预赛成绩,然后将每个预赛成绩乘以e^(该比赛的天数/500)。在本例中,对于每个用户,我们最多有2个以前的比赛,但在我的数据集中,可能会有200多个比赛,因此我需要有一个查询,该查询考虑了所有比赛的分数和每个比赛经过的时间。 -->e的值约为2.71828 compet

我在下面的链接中问了一个问题,其中一个成员帮助我解决了大部分问题(计算t列和pre_列分数)。但我需要再计算一列。我在下面的链接中解释了细节

总之,我如何使用t列和pre_列分数计算智力资本列?“智力资本”列考虑所有以前比赛的预赛成绩,然后将每个预赛成绩乘以e^(该比赛的天数/500)。在本例中,对于每个用户,我们最多有2个以前的比赛,但在我的数据集中,可能会有200多个比赛,因此我需要有一个查询,该查询考虑了所有比赛的分数和每个比赛经过的时间。 -->e的值约为2.71828

competitionId用户ID t预评分智能资本
1           	    100			
2100-43000*功率(e,-4/500)
3100-540000 3000*功率(e,-9/500)+4000*功率(e,-5/500)
1           	    200			
4200-193000*功率(e,-19/500)
1           	    300			
3300-93000*功率(e,-9/500)
4300-101200 3000*功率(e,-19/500)+1200*功率(e,-10/500)
1	            400			
2400-43000*功率(e,-4/500)
3400-54000 3000*功率(e,-9/500)+4000*功率(e,-5/500)
此结果:

| prev_score | intellectual_capital | competitionsId | UserId |                 date | score | day_diff |      t | prev_score |
|------------|----------------------|----------------|--------|----------------------|-------|----------|--------|------------|
|     (null) |               (null) |              1 |    100 | 2015-01-01T00:00:00Z |  3000 |       -4 | (null) |     (null) |
|       3000 |              2976.09 |              2 |    100 | 2015-01-05T00:00:00Z |  4000 |       -5 |     -4 |       3000 |
|       4000 |              6936.29 |              3 |    100 | 2015-01-10T00:00:00Z |  1200 |   (null) |     -5 |       4000 |
|     (null) |               (null) |              1 |    200 | 2015-01-01T00:00:00Z |  3000 |      -19 | (null) |     (null) |
|       3000 |              2888.13 |              4 |    200 | 2015-01-20T00:00:00Z |  1000 |   (null) |    -19 |       3000 |
|     (null) |               (null) |              1 |    300 | 2015-01-01T00:00:00Z |  3000 |       -9 | (null) |     (null) |
|       3000 |              2946.48 |              3 |    300 | 2015-01-10T00:00:00Z |  1200 |      -10 |     -9 |       3000 |
|       1200 |              4122.72 |              4 |    300 | 2015-01-20T00:00:00Z |  1000 |   (null) |    -10 |       1200 |
|     (null) |               (null) |              1 |    400 | 2015-01-01T00:00:00Z |  3000 |       -4 | (null) |     (null) |
|       3000 |              2976.09 |              2 |    400 | 2015-01-05T00:00:00Z |  4000 |       -5 |     -4 |       3000 |
|       4000 |              6936.29 |              3 |    400 | 2015-01-10T00:00:00Z |  1200 |   (null) |     -5 |       4000 |
由该查询生成,该查询现在包含
e

with Primo as (
      select
              *
            , datediff(day,lead([date],1) over(partition by userid order by [date]),[date]) day_diff
      from Table1
      )
, Secondo as (
      select
              *
           , lag(day_diff,1) over(partition by userid order by [date]) t
           , lag(score,1) over(partition by userid order by [date]) prev_score
      from primo
      )
 select
        prev_score
      , sum(prev_score*power(2.71828,t/500.0)) over(partition by userid order by [date]) intellectual_capital
      , competitionsId,UserId,date,score,day_diff,t,prev_score
from secondo

请解释一下幂(e的意思。
e
是什么意思?\u使用的是一个数学常数,大约等于2.71828。例如幂(e,2)=2.71828*2.71828=7.39我对SQL Server有非常基本的了解,您给我的帮助非常有用,我不知道如何感谢您。如果我有太多问题困扰您,请原谅,但我需要在分析中使用正确的列。这个问题(“e是什么?”)在前面的问题中迷失了方向。用这个缺失的值和公式中的一个小调整,我相信它现在产生了预期的值。@ UdEdYyByy已经是正确的。我写了太多的评论,重要的答案在评论中丢失了。对不起,这是我期待的结果。我希望它对所有的数据集都适用。感谢您的帮助。我再次为造成混淆和解释不当而道歉。谢谢:)这个公式是可伸缩的,所以“它应该”起作用,但是如果您在sqlfiddle扩展示例数据的大小和复杂性,您可以做一些测试。但是SQLFIDLE确实将左侧文本框的总大小限制为8000个字符。我将在我的数据集上进行测试,如果有问题,会告诉您。感谢您如此慷慨地解决用户的问题。