Go语言 平均值并从数据库获取标准偏差以构建图表

wztqucjr  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(118)

解释起来很难,所以我会把信息压缩到最小:
但首先,我将尝试解释我的最终目标,我想让试用过一个产品的用户,确定该产品如何影响一个价值,以百分比表示,与他们的平均基线相比,然后平均所有这些百分比与标准开发人员。
我有一个数据库,其中的表包含user_id、值和日期。
| 用户标识|价值|日期|
| - ------| - ------| - ------|
| 整数|整数|整数,以纪元毫秒为单位|
然后我有第二个表,它指示用户的试用开始和结束的时间以及他们正在使用的产品。
| 用户标识|开始日期|结束日期|产品识别码|
| - ------| - ------| - ------| - ------|
| 整数|以历元毫秒为单位的整数|以历元毫秒为单位的整数|整数|
我想做的是收集用户对一种产品类型的所有试用,并为每个参与的用户获取一个基线值和他们每天的百分比变化,然后取所有这些百分比的平均值,得到每天的标准差。
1.一个问题是date需要转换为自start_date以来的天数,因此在start日期和前24小时之间的任何时间都将被归为第0天,下一个24小时归为第1天,以此类推。
1.不是每一天都为每个用户记录,所以有些将有多个失踪的日子,所以我不需要标记为从开始的日子每一天

  1. start_date在用户之间随机
    因此,图表将如下所示:
    picture
    我更愿意尽可能多地用sql来做,但其余的将用Golang来做。
    我在考虑抓取每个试验,然后每个试验都有一个结果数组。然后我迭代每个试验,并迭代每个试验的结果,选择第0天,第1天,第2天,并将它们保存在自己的数组中,然后我将取平均值。一切开始变得超级混乱
    例如在SEMI伪码中:
db.Query("select user_id, start_date from trials where product_id = $1", productId).Scan(&trial.UserId, &trial.StartDate)

//extract trials from rows

for _, trial := range trials {
    // extract leadingAvgStart from StartDate
  db.QueryRow("select AVG(value) from results where user_id = $1 date between $2 and $3", trial.UserId, leadingAvgStart, trial.StartDate)
    // Now we have the baseline for the user

  rows :=  db.Query("select value, date from results where product_id = $1", start)
   //Now we extract the results and have and array
   //Convert Dates to Dates from start Date
   //...? It just start getting ugly and I believe there has to be a better way
}

我怎样才能用sql完成大部分繁重的工作呢?
x一个一个一个一个x一个一个二个x

mhd8tkvw

mhd8tkvw1#

好了,我已经弄明白了,基本上我执行了两个内连接查询,并将它们视为表,然后进行内连接,并使用group by进行平均

select 
  query1.product_uuid, 
  query1.days, 
  AVG(query1.value / query2.avg) as avg_percent 
from 
  (
    select 
      DATE_PART(
        'day', 
        to_timestamp(
          values 
            .date / 1000
        ):: date - trials.start_date
      ) as days, 
      trials.uuid as trial_uuid, 
      trials.product_uuid, 
    values 
      .value as value 
    from 
    values 
      as 
    values 
      inner join product_trials as trials ON 
    values 
      .user_id = trials.user_id 
    where 
    values 
      .source = 'Trued' 
      and 
    values 
      .use = 'true' 
      AND trials.start_date IS NOT NULL 
      AND trials.end_date IS NOT NULL 
      AND to_timestamp(
        values 
          .date / 1000
      ):: date > trials.start_date 
      AND to_timestamp(
        values 
          .date / 1000
      ):: date < trials.end_date
  ) as query1 
  inner join (
    select 
    values 
      .user_id, 
      trials.uuid as trial_uuid, 
      AVG(value) 
    from 
    values 
      inner join product_trials as trials ON 
    values 
      .user_id = trials.user_id 
    where 
      source = 'Trued' 
      and use = true 
      AND trials.start_date IS NOT NULL 
      AND trials.end_date IS NOT NULL 
      AND to_timestamp(
        values 
          .date / 1000
      ):: date < trials.start_date 
      AND DATE_PART(
        'day', 
        to_timestamp(
          values 
            .date / 1000
        ):: date - trials.start_date
      ) > -20 
    GROUP BY 
    values 
      .user_id, 
      trials.uuid
  ) as query2 ON query1.trial_uuid = query2.trial_uuid 
where 
  query2.avg > 0 
GROUP BY 
  query1.days, 
  query1.product_uuid 
ORDER BY 
  query1.product_uuid, 
  query1.days

相关问题