2017-07-17 5 views
-4
id orderId value 
1 2B0B 100 
2 2B0B 90 
3 2B0B 80 
4 2B0B 79 
5 2B0B 65 
6 2B0B 62 
7 2B0B 50 
8 2B0B 45 
9 2B0B 30 
10 2B0B 25 
11 2B0B 10 
12 2B0B 9 
13 2B0B 0 
14 2B0B 90 
15 2B0B 60 
16 2B0B 50 
17 2B0B 30 

Aus der obigen Tabelle, Ich versuche, die keine der Zeilen zwischen 100 bis 49Und 50 bis 24 und 25 bis 0laufende Zählung in mysql

Erwartet OP zu zählen:

Range count idBetween 
100-49 6  1-6 
50-24 3  7-9 
25-0 4  10-13 
100-49 2  14-15 
50-24 2  16-17 

Hier ist idBetween Anfang und Ende der ID Spalte wie group_concat (id) in jedem Bereich.

Gibt es trotzdem eine mysql Abfrage zu erreichen?

+0

Möchten Sie nur die Anzahl der Zahlen in Reichweite, oder möchten Sie auch die Spalte mit ID-Bereich, die ich nicht einmal weiß, wenn möglich? – Hatik

+0

Sie haben die Beschreibung des Feldes idBetween vollständig weggelassen. Auch die Bereiche und Ihre Ergebnisse stimmen nicht überein. Zum Beispiel scheint die Aufnahme mit der ID 10 nicht im Bereich von 50-24 gezählt zu werden, obwohl der Wert 25 ist. Sie müssen also viel mehr erklären. – Shadow

+0

auch die Bereiche sind Art von nicht logisch 100-49 50-24, wenn die Zahl 50 ist, bedeutet es, dass es in beiden zählt enthalten ist? – Hatik

Antwort

0

Hier ist eine Lösung auf den ersten Teil des Problems:

SELECT x.* 
    , CASE WHEN @prev > value THEN @i:[email protected] + 1 ELSE @i:[email protected] END i 
    , @prev:=value 
    FROM test x 
    , (SELECT @prev:=null, @i:=0) vars 
ORDER 
    BY id DESC; 

Der zweite Teil des Problems ist derzeit unklar.

1

Wenn Sie ein virtuelles Attribut erstellen, das jeden Bereich darstellt. Wenn die Bereiche linear wären, könnten Sie etwas tun wie:

SELECT 10*(FLOOR(value/10)), COUNT(*), MIN(id), MAX(id) 
FROM yourtable 
GROUP BY 10*(FLOOR(value/10)); 

Aber Ihre Bereiche sind nicht linear. Weiter sind sie nicht diskret! Unter der Annahme, dass Sie wirklich bedeuten Bereiche von 0-24, 25-49, 50-99 dann:

SELECT CASE 
    WHEN value>=100 THEN '100' 
    WHEN VALUE BETWEEN 50 AND 99 then '50-99' 
    WHEN VALUE BETWEEN 25 AND 49 THEN '25-49' 
    WHEN VALUE BETWEEN 0 AND 24 THEN '0-24' 
    ELSE 'ERROR' 
END AS bucket, 
COUNT(*), MIN(id), MAX(id) 
FROM yourtable 
GROUP BY CASE 
    WHEN value>=100 THEN '100' 
    WHEN VALUE BETWEEN 50 AND 99 then '50-99' 
    WHEN VALUE BETWEEN 25 AND 49 THEN '25-49' 
    WHEN VALUE BETWEEN 0 AND 24 THEN '0-24' 
    ELSE 'ERROR' 
END 

aber Ihr Beispiel Ausgabe zeigen, dass Sie auf Läufe von aufeinanderfolgenden Werten innerhalb eines Bereichs zu melden. "Konsekutiv" impliziert eine Bestellung - obwohl Ihr Eingabe-Set nach ID sortiert ist, sollten Sie angeben, welche Bestellung erforderlich ist.

Es ist möglich, dies in einer MySQL-Abfrage zu tun, aber der Code wird zu komplex

  • hier
  • zu schreiben

zu erhalten und mehr vernünftig in einer prozeduralen umgesetzt werden würde Programmiersprache.

+0

Mit Sitzungsvariablen können Sie sich um die Inseln kümmern. Aber die Frage ist mir noch unklar. – Shadow

+0

@Shadow 3: Fühlen Sie sich frei, Ihre Lösung zu teilen. – symcbean

+0

(unter Berücksichtigung, dass dies mindestens 2 Statusvariablen erfordert und die MySQL-Dokumentation nicht die Reihenfolge definiert, in der eingebettete Zuweisungen in nicht prozeduralem SQL ausgeführt werden). – symcbean