2017-04-26 4 views
0

Ich habe eine sehr einfache Tabelle genannt MYTABLE:SQL-Abfrage min (y) max (y) und X über eine Gruppe von

TSTAMP VARCHAR(20), VALUE VARCHAR(20) 

Der Zeitstempel ist wie yyyy-mm-TTThh: MM: SS.zzzZ (ex: 2017-04-25T12: 23: 00.000Z). Wert ist ein Float.

Ich weiß, das Tischmodell nur schlecht ist, aber es von jemand anderem vor vielen Jahren getan wurde, die offensichtlich nicht wusste, was er/sie tat.

Ich versuche eine effiziente Abfrage zu schreiben, um den min (VALUE), den max (VALUE) und ihren TIMESTAMP über Zeitintervalle (zB: min/max jeder Minute) zu erhalten. Ich bin in der Lage, den Min- und Max-Wert mit der folgenden Abfrage zu erhalten, aber ich kann keinen Weg sehen, ihre Zeitstempel zu bekommen.

SELECT MIN(tstamp) 
    , MAX(tstamp) 
    , MIN(value) minVal 
    , MAX(value) max 
    , ABS(TRUNCATE(((UNIX_TIMESTAMP(tstamp)*1000+SUBSTR(tstamp,-4,3)) - 1493115780000)/20000,0)) intervalNumber 
    , tstamp 
    FROM mytable 
WHERE tstamp BETWEEN '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z' 
    AND NOT tstamp = '2017-04-25T12:24:00.000Z' 
GROUP 
    BY intervalNumber; 

WHERE 1493115780000 ist das Ergebnis:

SELECT UNIX_TIMESTAMP('2017-04-25T12:23:00.000Z')*1000+SUBSTR('2017-04-25T12:23:00.000.000Z',-4,3); 

* EDIT, weil ich nicht RICHTIG ERKLÄREN war, was ich bekommen, ist für jedes Intervall: ersten Zeitstempel, Lasttimestamp, min Wert, maxvalue , interne Nummer, erste Zeitstempel

Was ich will ist: Zeitstempel von min Wert, Zeitstempel von max Wert, min Wert, max Wert, interv al Nummer


Ich benutze Mysql 5.5.

Jede Hilfe wäre geschätzt :) Es sieht aus wie ein Tutorial Universität, aber das ist jetzt zu weit hinter mir :(

+1

wäre es schön, wenn Sie die Fehlermeldung schreiben sind Sie –

+0

@ElmerDantas ich immer bin nicht Fehlermeldung bekommen. Es ist nur so, dass ich nicht herausfinden kann, wie man die Zeitstempel von Min- und Max-Werten erhält. – Marc

+1

@Milney: ich bin nicht derjenige, der dieses Datenmodell definiert (ich habe mich seit vielen Jahren darüber beschwert ....) Ich weiß, es ist einfach falsch ... – Marc

Antwort

0

Unter der Annahme, ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber korrekt ist.

Ich denke, dass sie etwas suchen, wie:

-- Min value 
SELECT top 1 min(TSTAMP), VALUE, 
    ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber 
FROM MYTABLE 
WHERE TSTAMP between '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z' 
    AND NOT TSTAMP='2017-04-25T12:24:00.000Z' 
GROUP BY VALUE desc 

-- Max value 
SELECT top 1 max(TSTAMP), VALUE, 
    ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber 
FROM MYTABLE 
WHERE TSTAMP between '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z' 
    AND NOT TSTAMP='2017-04-25T12:24:00.000Z' 
GROUP BY VALUE asc 

die beste Lösung wäre, um Ihre Tabelle in erster Linie zur Reinigung von allen in einer temporären Tabelle Dumping, erstellen Sie die Tabelle mit dem richtigen Struktur und Dump zurück mit Conversions Ihrer Anfrage. soll danach vereinfacht werden.

Verwandte Themen