2017-06-05 5 views
1

Ich habe eine Tabelle, wo ich die gespeicherte Anzahl von Fässern in vielen Tanks speichern. Ich speichere hier jeden Abend um Mitternacht Werte, und am Anfang und Ende jedes vom Betreiber initiierten Transfers.Suche nach Wechsel zwischen Datensätzen in MySQL

Was ich zurückgeben möchte, ist die Anzahl der Barrel-Differenz seit dem vorherigen Ereignisrekord für diesen spezifischen Tank. Ich habe die richtige ID für den Self-Join, um die vorherige Rekordnummer zu erhalten, allerdings ist der Barrel falsch.

Hier ist, was ich derzeit habe.

SELECT 
    inventory.id, 
    MAX(inventory2.id) AS id2, 
    inventory.tankname, 
    inventory.barrels, 
    inventory.eventstamp, 
    inventory2.barrels 
FROM 
    inventory 
LEFT JOIN 
    inventory inventory2 ON inventory2.tankname = inventory.tankname AND inventory2.eventstamp < inventory.eventstamp 
GROUP BY 
    inventory.id, 
    inventory.tankname, 
    inventory.barrels, 
    inventory.eventstamp 
ORDER BY 
    inventory.tankname, 
    inventory.eventstamp 

, dass die folgenden

enter image description here

Antwort

1

Verwenden Sie einfach korrelierte Unterabfragen zurückgibt:

SELECT i.*, 
     (SELECT i2.id 
     FROM inventory i2 
     WHERE i2.tankname = i.tankname AND 
       i2.eventstamp < i.eventstamp 
     ORDER BY i2.eventstamp DESC 
     LIMIT 1 
     ) as prev_id, 
     (SELECT i2.barrels 
     FROM inventory i2 
     WHERE i2.tankname = i.tankname AND 
       i2.eventstamp < i.eventstamp 
     ORDER BY i2.eventstamp DESC 
     LIMIT 1 
     ) as prev_barrels 
FROM inventory i 
ORDER BY i.tankname, i.eventstamp; 

Ihre Abfrage funktioniert nicht, weil Sie Spalten in der SELECT haben, die nicht in der sind GROUP BY und werden nicht aggregiert. Das sollte in keiner Datenbank erlaubt sein; Es ist bedauerlich, dass MySQL es erlaubt.

+0

Ich habe nicht erkannt, dass Sie Eltern Spalten in einer Unterabfrage verweisen können! –

Verwandte Themen