Select 考虑到时间衰减系数,为特定用户添加分数列的值
我在下面的链接中问了一个问题,其中一个成员帮助我解决了大部分问题(计算t列和pre_列分数)。但我需要再计算一列。我在下面的链接中解释了细节 总之,我如何使用t列和pre_列分数计算智力资本列?“智力资本”列考虑所有以前比赛的预赛成绩,然后将每个预赛成绩乘以e^(该比赛的天数/500)。在本例中,对于每个用户,我们最多有2个以前的比赛,但在我的数据集中,可能会有200多个比赛,因此我需要有一个查询,该查询考虑了所有比赛的分数和每个比赛经过的时间。 -->e的值约为2.71828Select 考虑到时间衰减系数,为特定用户添加分数列的值,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
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个字符。我将在我的数据集上进行测试,如果有问题,会告诉您。感谢您如此慷慨地解决用户的问题。