2016-10-29 75 views
0

我有一個MySQL表,有兩列:takenOn(datetime)和count(int)。 count包含我已採取的步驟數。MySQL的最低記錄總計爲10000

我想寫一個查詢,告訴我當我每天遇到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; 

這個工作,當然,給我的MIN(takenOn)僅10月29日。如何擴展此查詢以便爲我提供MIN(takenOn)表中所有可能的日期?

謝謝!

回答

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中表達式的評估順序。因此,如果您將作業拆分爲多個表達式,則不保證代碼可以正常工作。

+0

謝謝!這完美的作品!我只需要添加GROUP BY'Date'。 :) –

+1

@CheekuJee。 。 。如果您想要符合您的條件的最小值,您還應該使用'MIN(TotalCount)'。 –

0

您可以使用GROUP BY和HAVING子句來實現這一點,請參閱this example

SELECT 
    sum(takenON),date 
FROM 
    step 
GROUP BY 
    day(date) 
Having SUM(takenON)>150