首頁  >  問答  >  主體

後端開發 - mysql按時間分段統計的sql語句怎麼寫好?

我的資料庫表格結構如下:

#欄位分別是ID,NUM1,NUM2, TIME1,TIME2, MONEY.

想要依照15分鐘為間隔來統計ID的數量。效果如同下面的sql語句。

SELECT  
  sum(CASE when TIME1 >= '2014-02-27 8:00:00' and TIME1 < '2014-02-27 8:15:00' then 1 else 0 end)   AS '1',  
  sum(CASE when TIME1 >= '2014-02-27 8:15:00' AND TIME1 < '2014-02-27 8:30:00' then 1 else 0 end)   AS '2',  
  sum(CASE when TIME1 >= '2014-02-27 8:30:00' AND TIME1 < '2014-02-27 8:45:00' then 1 else 0 end)   AS '3',  
  sum(CASE when TIME1 >= '2014-02-27 8:45:00' AND TIME1 < '2014-02-27 9:00:00' then 1 else 0 end)   AS '4',  
  sum(CASE when TIME1 >= '2014-02-27 9:00:00' and TIME1 < '2014-02-27 9:15:00' then 1 else 0 end)   AS '5'  
from dealdata;

#但是像上面那麼寫重複程式碼多,如果我改成30分鐘的話,就要改動很多,所以求助sql大神,看有什麼好的方法。

———————————————————————————————————分割線—————————— ——————————————————————————

謝謝 arm 同志的幫助,現在能查詢出現了

#count(id)就是進站的人
但是有的時間段,根本沒有進站的人,所以有的時間段沒有,例如5:00 -- 5:15
如果要將沒有進站的人的時段補全為0,該怎麼做呢?

黄舟黄舟2703 天前941

全部回覆(3)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-05-25 15:10:22

    謝邀,可以縱向排列的化,如下

    SELECT count(id)
    from dealdata
    where timestampdiff(minute,'2014-02-27 9:15:00',`TIME1`)<0 and timestampdiff(minute,'2014-02-27 8:00:00',`TIME1`)>=0
    group by floor(timestampdiff(minute,'2014-02-27 8:00:00',`TIME1`)/15)
    

    where 限制時間段,group by裡面除以你需要的時間間隔。
    我不知道你為什麼出錯,可能跟mysql版本有關,我是mysql5.6

    SELECT count(*),
    floor(timestampdiff(minute,'2017-1-18 16:00:00',`time`)/30),
    date_add('2017-1-18 16:00:00',interval 30*floor(timestampdiff(minute,'2017-1-18 16:00:00',`time`)/30) MINUTE)
    FROM 我是马赛克.我是马赛克
    group by floor(timestampdiff(minute,'2017-1-18 16:00:00',`time`)/30)

    結果

    看了下,跑的還蠻快的,0.3s不到

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-25 15:10:22

    列數不定啊,真的定義不少變數

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-25 15:10:22

    腳本驅動MySQL ,自訂一個變數。也許有更好的辦法,我就閒的回答了下

    回覆
    0
  • 取消回覆