2016-09-29 3 views
1

Ich habe eine Tabelle mit historischen Aufzeichnungen, die dort durch mehrere Auslöser in einer Haupttabelle veröffentlicht. Ich möchte eine Select-Anweisung in der History-Tabelle erstellen, in der jeder Datensatz mit seinem vorherigen Datensatz verbunden ist (identifiziert durch die gleiche LineID und das höchste ActionDate), sodass ich die Unterschiede zwischen diesen beiden extrahieren kann.Beitreten einer Tabelle mit vorherigen Datensatz der gleichen Tabelle

Ich versuchte dies aber (My) SQL Referenzen im gefügten subselect zum ersten „FROM“ Tabelle nicht erlaubt: Unbekannte Spalte h1.LineID in where-Klausel

select 
    h1.*, 
    prev.* 
from history h1 
LEFT OUTER JOIN 
    (Select * 
    From history h2 
    where h1.LineID=h2.LineID and h2.ActionDate < h1.ActionDate 
    order by Actiondate desc limit 1 
) prev on h1.LineID=prev.LineID 

Wie kann ich das erreichen?

+0

könnte dies nicht helfen? http://StackOverflow.com/Questions/15527423/How-to-self-join-table-in-a-way-that-every-record-is-joined-with-the-previous –

Antwort

3

Sie einen Verweis auf die vorherige Zeile bekommen mit:

select h.*, 
     (select h2.ActionDate 
     from history h2 
     where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate 
     order by h2.ActionDate desc 
     limit 1 
     ) as prev_ActionDate 
from history h; 

Wenn Sie die komplette Zeile möchten, können Sie eine join verwenden, um die Daten zu erhalten:

select h.*, hprev.* 
from (select h.*, 
      (select h2.ActionDate 
       from history h2 
       where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate 
       order by h2.ActionDate desc 
       limit 1 
      ) as prev_ActionDate 
     from history h 
    ) h left join 
    history hprev 
    on hprev.LineId = h.LineId and hprev.ActionDate = h.prev_ActionDate; 
+0

Vielen Dank! Gelöst habe ich es auf eine etwas andere Art und Weise, aber Ihre Lösung funktioniert auch – Bascy

1

Code unten verwenden Bitte

select * from Geschichte als h Exklusionsverknüpfung Geschichte als pre auf pre.ActionDate < h.ActionDate und prev.LineID = h.LineID

Ich hoffe, es wird Ihnen helfen.

+1

Das wird nicht funktionieren, da der INNER JOIN mir nur Datensätze geben wird, die einen vorherigen haben, und nicht die Datensätze, die keinen vorherigen haben (ich habe das nicht in der Frage, aber immer noch ein Muss für mich). Wenn ich es zu einem OUTER JOIN ändere, ergibt es eine Übereinstimmung mit JEDEM Record mit einem früheren Actiondate, ich möchte nur den einen direkt vor dem aktuellen – Bascy

0

es selbst mit dem folgenden Code Gelöst:

select * 
from history h1 
LEFT OUTER JOIN history h2 on h1.LineID=h2.LineID 
    and h2.ActionDate = (select max(actiondate) 
         from history h3 
         where h3.LineID=h1.LineId and h3.Actiondate < h1.ActionDate 
         ) 
order by h1.actiondate desc; 
Verwandte Themen