2016-04-23 11 views
0

Ich möchte den letzten und zweitletzten Spaltenwertunterschied zum Gruppentyp finden. Und die Art Zahl muss größer als 1Späteste und zweitletzte Spaltenwerte

Betrachten Sie diese Beispieldaten in meiner Tabelle:

type value  date 
-------------------------------- 
2  5 2015-05-09 12:42:00 
4  -42 2015-05-09 13:19:57 
2  2 2015-05-09 14:48:30 
2  7 2015-05-09 12:54:39 
3  16 2015-05-09 13:19:57 
3  20 2015-05-09 15:01:09 

ich das Ergebnis möchte

type Value 
--------------------- 
    2  -5 
    3  4 

dh für den Typ-2, um als letzter Wert ist 2 und der zweitletzte Wert ist 7, also ist der Unterschied zwischen ihnen -5.

+0

Bitte fügen Sie die Abfrage, die Sie ausprobiert haben, selbst hinzu. – Sebastian

+0

Das Datum sollte innerhalb der Gruppe eindeutig sein, sonst ist dies keine deterministische Aufgabe .... –

Antwort

0

könnten Sie Variablen verwenden, um die Anzahl der Tabellen-Scans zu reduzieren benötigt:

SELECT type, 
     value 
FROM ( SELECT @n := IF(type = @t, @n+1, 1) as num, 
       @t := type     as type, 
       @v - value     as value, 
       @v := value 
     FROM  mytable 
     ORDER BY type, 
       date DESC) base 
WHERE num = 2 

SQL Fiddle

Die Idee zu geben zeichnet eine Rekordzahl, dass für jeder unterschiedliche Wert von Typ beginnt wieder bei 1 und steigt dann mit absteigenden Datumswerten an.

Drei Variablen aktualisiert gehalten werden, während durch die Datensätze in der Reihenfolge der Art zu gehen und nach dem Aufnahmedatum absteigend:

  • @n: die Zahl Rekord zum vorherigen Datensatz gegeben;
  • @ t: der Wert der Spalte im vorherigen Datensatz;
  • @v: der Wert der Wert Spalte in den vorherigen Aufzeichnungen;

Alle drei werden wie folgt aktualisiert:

Wenn für den aktuellen Datensatz der Typ Wert der gleiche wie im vorherigen Datensatz, dann @n mit jeweils einer, sonst ist es zurückgesetzt 1.

Für jeden Datensatz wird auch der Unterschied zwischen dem Wert des aktuellen und vorherigen Datensatzes zurückgegeben.

Typ und Wert werden aktualisiert, um die aktuellen Datensatzwerte widerzuspiegeln.

Schließlich werden nur Datensätze mit der Nummer zwei in der Ergebnismenge beibehalten.

0
select t1.type, t1.value - t2.value as value 
from mytable t1 
join mytable t2 using(type) 
where t1.date = (
    select max(date) 
    from mytable t1m 
    where t1m.type = t1.type 
) 
    and t2.date = (
    select max(date) 
    from mytable t2m 
    where t2m.type = t1.type 
     and t2m.date <> t1.date 
) 

http://www.sqlfiddle.com/#!2/5a3298/2

Verwandte Themen