按新近度将动量计算为加权平均值
Calculate momentum as weighted average by recency
我有一个订阅 table,具有关联的 feed_id 和创建时间戳。一个提要有 N 个订阅。
使用 group
查询来计算每个 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)
如何在单个 (My)SQL 查询中完成类似的事情,而不是使用 3 个查询并以编程方式对结果求和?
您可以为此使用条件聚合。 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
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 ...
我不是 100% 确定我已经抓住边缘条件(昨天或 8 天前)以获得准确的正确计数。你会想测试一下。
如果您对 24 小时制感兴趣,则只需将 NOW()
替换为 CURDATE()
,一切都将转到 DATETIME。
我有一个订阅 table,具有关联的 feed_id 和创建时间戳。一个提要有 N 个订阅。
使用 group
查询来计算每个 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)
如何在单个 (My)SQL 查询中完成类似的事情,而不是使用 3 个查询并以编程方式对结果求和?
您可以为此使用条件聚合。 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
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 ...
我不是 100% 确定我已经抓住边缘条件(昨天或 8 天前)以获得准确的正确计数。你会想测试一下。
如果您对 24 小时制感兴趣,则只需将 NOW()
替换为 CURDATE()
,一切都将转到 DATETIME。