通过新近度计算动量作为加权平均值

时间:2015-03-15 12:21:11

标签: mysql weighted-average trend

我有一个订阅表,其中包含相关的feed_id和创建时间戳。 Feed有N个订阅。

使用group查询显示最受欢迎的Feed非常容易,可以计算每个feed_id的记录数。但是我想计算动量以显示最趋势的饲料。

简化的算法是:

momentum of feed_id =
    10 * (count of subscriptions with created_at in past day)
  + 5 *  (count of subscriptions with created_at from 2-7 days ago)
  + 1 *  (count of subscriptions with created_at from 7-28 days ago)

如何在单个(我的)SQL查询中完成这样的事情而不是使用3个查询并以编程方式对结果进行求和?

2 个答案:

答案 0 :(得分:2)

您可以使用条件聚合。 MySQL将布尔值视为整数,其中true为“1”,因此您只需将表达式求和即可。

我猜它看起来像这样:

select feedid,
       (10 * sum(createdat >= date_sub(now(), interval 1 day)) +
         5 * sum(createdat >= date_sub(now(), interval 7 day) and
                 createdat < date_sub(now(), interval 1 day)) +
         1 * sum(createdat >= date_sub(now(), interval 28 day) and
                 createdat < date_sub(now(), interval 7 day))
       ) as momentum
from subscriptions
group by feedid

答案 1 :(得分:1)

SELECT 10*COUNT(IF(created_at >= CURDATE(), 1, 0)) +
       5*COUNT(IF(created_at BETWEEN DATE_ADD(CURDATE(), - INTERVAL 7 days) AND DATE_ADD(CURDATE(), - INTERVAL 1 day), 1, 0) +
       1*COUNT(IF(created_at BETWEEN DATE_ADD(CURDATE(), - INTERVAL 28 days) AND DATE_ADD(CURDATE(), - INTERVAL 8 day), 1, 0)
FROM ...

我不是百分百肯定我已经抓住了边缘条件(昨天或8天前)来获得正确的计数。你想测试一下。

如果您对24小时段感兴趣,那么只需将NOW()替换为CURDATE(),所有内容都将转到DATETIME。