Wie man die fortlaufende Nummer von 10 Tagen zählt

Ich habe Tabelle mit Spalten: ID, Name, date, Gegenwart Spalte vorhanden haben Werte 0 oder 1 oder 2 und … mehr Ich muss zählen, wie viele 0 valous ist im aktuellen Monat 2013-07-01 – 2013-07-31 aber zählen Sie nur, wenn es mehr als 10 mal gibt.

zum Beispiel, wenn ich 2013-07-01 bis 2013-07-10 valoues 0 habe, sollte es zählen und lassen Sie mich wissen, dass 10 oder mehr aufeinanderfolgende Tage wie 11, 12 oder mehr ist, aber wenn es weniger als 10 war, sollte nichts zählen .

Ich habe einige Beispiele aus dem Stack versucht … aber das sind andere Probleme … also brauche ich wenig Hilfe bei dieser MySQL-Abfrage.

Ich habe so etwas, aber brauche Konsekutiv 10 Tage wie> = 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']; } 

Es zählt mich alle 0 Werte in date zwischen 2013-07-01 und 2013-07-31, aber ich muss zählen, wie viele Tage ab 10 oder mehr aufeinander folgenden Tagen beginnen

Spalte vorhanden haben 0 und andere Zahlen wie 1, 2, 3 … so muss ich nur 0 mit 10 oder mehr aufeinander folgenden Tagen zählen

Hier ist SqlFiddle ich versuchte, aus der Antwort zu machen http://sqlfiddle.com/#!2/1bde8/2

Beste Grüße m.

Solutions Collecting From Web of "Wie man die fortlaufende Nummer von 10 Tagen zählt"

Dieser Ansatz verwendet korrelierte Unterabfragen, um zwei Werte zu berechnen.

Der erste Wert ist das date des vorherigen datasatzes, in dem Present = 1 . Dadurch können Sie die Anzahl der Tage in einer Zeile mit Present = 0 indem Sie datediff() .

Die Sekunde ist der Present von Morgen, der am letzten Tag des Monats NULL . Wenn heute Present = 0 und morgen entweder 1 oder NULL , können wir diesen Record verwenden. Es ist das Ende einer Sequenz von 0 s.

Von da an ist es nur eine Frage der Addition der Werte gemäß den von Ihnen festgelegten Bedingungen. Die folgende Abfrage geht davon aus, dass Sie dies für jeden name tun möchten:

 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 

Diese Abfrage sollte nur zählen, wenn sie 10 oder größer als 10 ist.

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

Ich hoffe es hilft!

Nicht getestet, aber Sie könnten Benutzervariablen wie folgt verwenden:

 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 

Holen Sie alle datasätze in datesreihenfolge und fügen Sie eine Sequenznummer für die Zählung hinzu, da die Gegenwart die erste 0 war. Zählen Sie dann, wie oft der Zähler 10 ist.