【发布时间】:2018-08-16 18:45:34
【问题描述】:
我正在跟踪每天的步数。我想使用 7 天期间中最好的 5 天来获得平均步数/天。我的最终目标是在总共 16 周内,在 7 天中获得最佳 5 天的平均值。
这是我的 sqlfiddle - http://sqlfiddle.com/#!9/5e69bdf/2
这是我当前使用的查询,但我发现结果不正确。它采用 7 天的平均值,而不是选择步数最多的 5 天。根据我在 sqlfiddle 中发布的数据,它平均输出 14,122,而不是 11,606。
SELECT SUM(a.steps) as StepsTotal, AVG(a.steps) AS AVGSteps
FROM (SELECT * FROM activities
JOIN Courses
WHERE activities.encodedid=? AND activities.activitydate BETWEEN
DATE_ADD(Courses.Startsemester, INTERVAL $y DAY) AND
DATE_ADD(Courses.Startsemester, INTERVAL $x DAY)
ORDER BY activities.steps DESC LIMIT 5
) a
GROUP BY a.encodedid
这是相同的查询,其中填充了用于测试的值:
SELECT SUM(a.steps) as StepsTotal, AVG(a.steps) AS AVGSteps
FROM (SELECT * FROM activities
JOIN Courses
WHERE activities.encodedid='42XPC3' AND activities.activitydate BETWEEN
DATE_ADD(Courses.Startsemester, INTERVAL 0 DAY) AND
DATE_ADD(Courses.Startsemester, INTERVAL 6 DAY)
ORDER BY activities.steps DESC LIMIT 5
) a
GROUP BY a.encodedid
【问题讨论】:
-
7天期限什么时候开始?
-
2018-07-12 - 在课程表中开始学期。
-
在查看您的 SQL Fiddle 时,Courses 是空的。不知道为什么。我在您的架构中看不到任何错误,但
SELECT * FROM Courses返回 0 行。 -
@SloanThrasher 我在 SQL Fiddle 中显示了 Courses 表和数据。谢谢。
-
您得到不正确结果的一个原因是每个活动行都被计算了多次,因为它们与课程表中的多行匹配。您可以考虑只返回 Courses 表中的 DISTINCT 日期。