我有一个包含两列的MySQL表:takenOn
(datetime)和count
(int)。 count
包含我已采取的步骤数。
我正在尝试编写一个查询,告诉我每天达到10,000个步骤的目标的时间。
到目前为止,我有以下查询:
SET @runningTotal=0;
SELECT
`Date`,
DATE_FORMAT(MIN(takenOn), '%l:%i %p') AS `Time`,
TotalCount
FROM
(SELECT
DATE(s.takenOn) AS `Date`,
s.takenOn,
s.`count`,
@runningTotal := @runningTotal + s.`count` AS TotalCount
FROM
(select * from step where DATE(takenOn) = '2016-10-29') s) temp
WHERE TotalCount >= 10000;
这可行,但是当然只给我10月29日的
MIN(takenOn)
。如何扩展此查询以为表中所有可能的日期提供MIN(takenOn)
?谢谢!
最佳答案
我假设您关心的步骤都在一天之内。您走在正确的轨道上。这是多天的代码:
SELECT `Date`, DATE_FORMAT(MIN(takenOn), '%l:%i %p') AS `Time`,
MIN(TotalCount)
FROM (SELECT DATE(s.takenOn) AS `Date`,
s.takenOn,
s.`count`,
(@runningTotal := if(@d = DATE(s.takenOn), @runningTotal + s.`count`,
if(@d := DATE(s.takeOn), s.`count`, s.`count`)
)
) AS TotalCount
FROM step s CROSS JOIN
(SELECT @runningTotal := 0, @d = '') params
ORDER BY takenOn
) s
WHERE TotalCount >= 10000
GROUP BY `Date`;
请注意,所有变量分配都在一个表达式中。这很重要,因为MySQL不保证
SELECT
中表达式的求值顺序。因此,如果您将分配分配给一个以上的表达式,则不能保证代码可以正常工作。