我有一个db表,它有一个日期字段,一个用户名字段和一个整数点余额字段。每天都有记录,在工作日结束时存储余额。
我正在寻找最有效的方法来计算每位用户的平均每日增幅,将最高平均每日增幅排序为最低。
答案 0 :(得分:2)
这适用于MS SQL Server。它假设每个用户每个日期确实有一个条目,日期没有间隙,并且没有时间(小时,分钟,秒)值。 (此外,没有空值!)它将计算平均每日增加量,无论它是否实际上都在上升。
SELECT mt.UserName, avg(mt.Balance - mt2.Balance) AvgDailyIncrease
from MyTable mt
inner join MyTable mt2
on mt2.UserName = mt.UserName
and mt2.CaptureDate = dateadd(dd, -1, mt.CaptureDate)
group by mt.UserName
order by avg(mt.Balance - mt2.Balance) desc
答案 1 :(得分:0)
假设余额总是增加,您可以在第一天找到余额,在最后一天找到余额,并计算平均值(基于天数):
;with minmax as ( -- subquery to get min / max data per user
select
username
,min(capturedate) as mincapturedate
,min(balance) as minbalance
,max(capturedate) as maxcapturedate
,max(balance) as maxbalance
from
[5171722] t
group by username
)
,averageincrease as ( -- subquery to calculate average daily increase
select
username
,datediff(day, mincapturedate, maxcapturedate) as numdays
,(maxbalance - minbalance) as totalincrease
,(maxbalance - minbalance) / datediff(day, mincapturedate, maxcapturedate) as
averagedailyincrease
from
minmax
)
-- pull results together, with highest average daily increase first
select
*
from
averageincrease
order by
averagedailyincrease desc
结尾处的字段averagedailyincrease
包含每日平均增幅。