Sql для среднесуточного прироста - PullRequest
1 голос
/ 02 марта 2011

У меня есть таблица БД, в которой есть поле даты, поле имени пользователя и поле баланса целых точек.Существует запись для каждого дня, сохраняющая баланс в конце рабочего дня.

Я ищу наиболее эффективный способ расчета среднесуточного прироста для каждого пользователя, сортируя наибольший среднесуточный прирост досамый низкий.

enter image description here

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Это должно работать для 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
0 голосов
/ 02 марта 2011

Предполагая, что сальдо всегда увеличивается, вы можете просто найти сальдо в первый день, сальдо в последний день и рассчитать среднее значение (на основе количества дней):

;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 в конце содержит среднесуточное увеличение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...