Mysql查询以查找一段时间内值的百分比变化

Posted

技术标签:

【中文标题】Mysql查询以查找一段时间内值的百分比变化【英文标题】:Mysql query to find percentage change in the value over a time 【发布时间】:2014-07-13 18:07:49 【问题描述】:

我有一个表格,其中包含与他投资的用户和跟踪/单位相关的值和日期。如下所示:

id , track_id , user_id , value  , created_at          , updated_at,
 1 ,        7 ,       7 , 310.00 , 2014-07-11 11:55:20 , 0000-00-00 00:00:00,
 2 ,        2 ,       3 , 400.00 , 2014-07-10 00:00:00 , 0000-00-00 00:00:00,
 3 ,        2 ,       3 , 300.00 , 2014-07-11 00:00:00 , 0000-00-00 00:00:00,
 4 ,        4 ,       7 , 500.00 , 2014-07-11 09:23:17 , 0000-00-00 00:00:00,

我想要一个查询来获取类似的结果

user_id,增益(%)

所以基本上查询会在过去 7 天内获取前 N 个说 3 个赢家。 mysql 中的我的数据库

【问题讨论】:

好的,到目前为止你尝试过什么? 我是一名开发人员,对mysql查询不太熟悉。所以无论我尝试什么都没有结果,所以没有发布。 好的,无论如何请发布它,以便我们帮助您完成它。 我点击了这个链接***.com/questions/13671230/… 你的问题绝对是一个公平的问题——我不知道人们为什么要贬低你。无论如何 - 看这里:Join - calculating percent change from one record to next 【参考方案1】:

这有点痛苦。以下查询获取前一周的最小和最大日期:

select user_id, min(created_at) as mind, max(created_at) as maxd
from table t
where created_at >= now() - interval 7 day
group by user_id;

现在,您可以通过加入来使用它来获取适当的值:

select user_id, tmin.value, tmax.value
from (select user_id, min(created_at) as mind, max(created_at) as maxd
      from table t
      where created_at >= now() - interval 7 day
      group by user_id
     ) umm join
     table tmin
     on umm.user_id = tmin.user_id and umm.mind = tmin.created_at join
     table tmax
     on umm.user_id = tmax.user_id and umm.maxd = tmax.created_at;

这为您提供了执行查询的信息。比如:

select user_id, tmin.value, tmax.value,
       (tmax.value - tmin.value) / tmax.value as gain_ratio
from (select user_id, min(created_at) as mind, max(created_at) as maxd
      from table t
      where created_at >= now() - interval 7 day
      group by user_id
     ) umm join
     table tmin
     on umm.user_id = tmin.user_id and umm.mind = tmin.created_at join
     table tmax
     on umm.user_id = tmax.user_id and umm.maxd = tmax.created_at;

【讨论】:

非常感谢..它解决了我的问题..我不能投票给你的答案,因为它需要至少 15 名声望。【参考方案2】:

这应该可以满足您的需要,我返回了旧/新值以进行说明,如果您只想要用户 ID 和 % 增益,您可以将它们从选择列表中删除 -

select x.user_id,
       x.value as new_val,
       y.value as prev_val,
       (y.value / x.value - 1) * 100 as gain_pct
  from tbl x
  join tbl y
    on x.user_id = y.user_id
 where x.created_at =
       (select max(z.created_at)
          from tbl z
         where z.user_id = x.user_id
           and z.created_at between date_sub(current_date, interval 7 day) and
               current_date)
   and y.created_at =
       (select min(z.created_at)
          from tbl z
         where z.user_id = x.user_id
           and z.created_at between date_sub(current_date, interval 7 day) and
               current_date)
order by gain_pct desc
limit 3

使用 LIMIT 返回前 3、5、10 等。

小提琴: http://sqlfiddle.com/#!2/037243/10/0

【讨论】:

以上是关于Mysql查询以查找一段时间内值的百分比变化的主要内容,如果未能解决你的问题,请参考以下文章

查询数组内值的活动记录

Hive 查询以查找百分比值

Sql查询以查找两个给定日期之间的视图百分比差异

SQL 查询以查找具有相同列值的多行

pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)

从 PySpark 中的类别分布中查找值的百分位数