我有一个包含两列的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)
?
谢谢!
答案 0 :(得分:2)
我假设你关心的步骤都在一天之内。你走在正确的轨道上。这是多天的代码:
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
中表达式的评估顺序。因此,如果您将分配分配到多个表达式,则无法保证代码可以正常工作。
答案 1 :(得分:0)
您可以使用Group By和Having子句来实现此目的,请参阅this example:
SELECT
sum(takenON),date
FROM
step
GROUP BY
day(date)
Having SUM(takenON)>150