2013-07-14 56 views
0

我有表的列:id,名稱,日期,目前 列目前有值0或1或2和...更多 我需要計算有多少個0瓦爾斯是在當前月份2013-07-01 - 2013-07-31但是隻有在有10次或更多時纔算。如何連續數10天

例如,如果我有 2013-07-01至2013-07-10 valoues 0它應該計算它,並讓我知道,是連續10天或更多像11,12或更多,但如果它少應該算不上什麼。

我正在嘗試從堆棧中的一些例子......但他們是不同的問題......所以我需要一點幫助,與MySQL的查詢。

我有水木清華這樣的,但需要consecutives 10幾天喜歡> = 10

$sql = mysql_query("SELECT COUNT(name) as count FROM `table` WHERE (`present` = 0) AND (`date` BETWEEN '2013-07-01' AND '2013-07-31')"); 

while($row = mysql_fetch_array($sql)){ 
    $result = $row['count']; 
} 

它計算我在日起每0值2013-07-01與2013年7月31日之間,但我需要怎麼算許多天從10個或更多consecutives天

列目前開始有0和其他號碼,如1,2,3 ...所以我需要數只有0與10個或更多consecutives天

這裏是SqlFiddle我是試圖從回答 http://sqlfiddle.com/#!2/1bde8/2

最好的問候 米。

回答

2

該方法使用相關子查詢來計算兩個值。

第一個值是前一記錄的日期,其中Present = 1。這允許您通過使用datediff()獲得連續的天數Present = 0

第二個是明天的價值Present,這個月的最後一天是NULL。如果今天有Present = 0,明天是1NULL,那麼我們可以使用這條記錄。它是0 s序列的結尾。

從這裏只是根據您設置的條件來合併值的問題。下面的查詢假定您要爲每個name做到這一點:

select name, sum(case when datediff(date, lastPresentDate) >= 10 
         then datediff(date, lastPresentDate) 
       else 0 end) as DaysCounted 
from (select t.*, 
      (select coalesce(max(date), '2013-06-30') 
       from t t2 
       where t2.name = t.name and 
        t2.present <> 0 and 
        t2.date <= t.date and 
        t2.date between '2013-07-01' and '2013-07-31' 
      ) as lastPresentDate, 
      (select t2.present 
       from t t2 
       where t2.name = t.name and 
        t2.date = adddate(t.date, 1) 
       order by t2.date 
       limit 1 
      ) as TomorrowPresent 
     from t 
     where date between '2013-07-01' and '2013-07-31' 
    ) t 
where Present = 0 and (TomorrowPresent = 1 and TomorrowPresent is null) 
group by name 
+0

因爲你可以看到我有查詢,統計我有多少0值之間的日期之間,但我需要實現10個或更多的連續天 – Kenny

+0

@ user1805538。 。 。這就是這個查詢所做的。 –

+0

我正在測試該查詢並獲得「子查詢返回多於一行」 – Kenny

0

該查詢應該給你一個數,只有當它是10或大於10

SELECT COUNT(`name`) as `count` 
FROM `table` 
WHERE (`present` = 0) 
AND (`date` BETWEEN '2013-07-01' AND '2013-07-31') 
HAVING `count` >= 10; 

希望它能幫助!

+0

是,但我需要連續10天 – Kenny

0

沒有測試,但是你可以使用用戶變量是這樣的: -

SELECT SUM(if(ConsCounter=10, 1, 0)) 
FROM 
(
    SELECT id, name, date, present, @Counter := IF(@PrevPresent = present AND present = 0, @Counter + 1, 0) AS ConsCounter, @PrevPresent = present 
    FROM 
    (
     SELECT id, name, date, present 
     FROM `table` 
     ORDER BY date 
    ) Sub1 
    CROSS JOIN (SELECT @PrevPresent:=-99999, @Counter:=0) Sub2 
) Sub4 

按照日期順序取得所有記錄,並添加一個序列號爲計數,因爲本是第一0再算上數的時間,計數器是10.