解释起来很难,所以我会把信息压缩到最小:
但首先,我将尝试解释我的最终目标,我想让试用过一个产品的用户,确定该产品如何影响一个价值,以百分比表示,与他们的平均基线相比,然后平均所有这些百分比与标准开发人员。
我有一个数据库,其中的表包含user_id、值和日期。
| 用户标识|价值|日期|
| - ------| - ------| - ------|
| 整数|整数|整数,以纪元毫秒为单位|
然后我有第二个表,它指示用户的试用开始和结束的时间以及他们正在使用的产品。
| 用户标识|开始日期|结束日期|产品识别码|
| - ------| - ------| - ------| - ------|
| 整数|以历元毫秒为单位的整数|以历元毫秒为单位的整数|整数|
我想做的是收集用户对一种产品类型的所有试用,并为每个参与的用户获取一个基线值和他们每天的百分比变化,然后取所有这些百分比的平均值,得到每天的标准差。
1.一个问题是date需要转换为自start_date以来的天数,因此在start日期和前24小时之间的任何时间都将被归为第0天,下一个24小时归为第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
1条答案
按热度按时间mhd8tkvw1#
好了,我已经弄明白了,基本上我执行了两个内连接查询,并将它们视为表,然后进行内连接,并使用group by进行平均