2009-06-24 2 views
1

Wie wird der vorherige Spaltenwert abgerufen?So erhalten Sie den aktuellen Spaltenwert, Vorherige Spaltenwert

IIf id1 = id2 then display previous column id1 value 


id1 id2 

1001 1001 
1002 1002 
1003 1003 

so weiter ...

select id1, id2, Iff id2 = id1 then disply previous id1 value as idadjusted 

Ausgabe

id1 id2 id3(Expected) 

1001 1001 **1000** 
1002 1002 **1001** 
1003 1003 **1002** 

so weiter ...

ich meine vorherigen Spalte Wert von id1

disply wollen Abfrage

SELECT CARDNO, NAME, TITLENAME, CARDEVENTDATE, MIN(CARDEVENTTIME) AS INTIME, MAX(CARDEVENTTIME) AS OUTTIME, 

CARDEVENTDATE AS LASTDATE, MAX(CARDEVENTTIME) AS LASTTIME 

FROM (SELECT T_PERSON.CARDNO, T_PERSON.NAME, T_TITLE.TITLENAME, T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME FROM (T_TITLE INNER JOIN T_PERSON ON T_TITLE.TITLECODE = T_PERSON.TITLECODE) INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID ORDER BY T_PERSON.TITLECODE) GROUP BY CARDNO, NAME, TITLENAME, CARDEVENTDATE 

Für die lastdate - I Vorherige Spalte cardeventdate Wert anzeigen möchten Für die Lasttime - I vorherigen Spalte outtime Wert

benötigen Query-Hilfe angezeigt werden soll?

+0

http://stackoverflow.com/questions/229784/tips-for-effectively-tagging-questions –

+0

Bitte fügen Sie weitere Informationen – gbn

+0

Was meinen Sie vorherigen column1 Wert? – Tetraneutron

Antwort

0

Wenn Sie Ihre Datenbank entwerfen, sollten Sie berücksichtigen, dass Sie sich nicht darauf verlassen können, dass alle Zeilen in der richtigen Reihenfolge stehen. Stattdessen sollten Sie einen Identitätswert erstellen, der für jede neue Zeile um eins erhöht wird. Und wenn Sie dies Ihre Lösung tun wird einfach (oder einfacher zumindest)

eine neue Spalte ID

SELECT colum1 FROM myTable WHERE ID = (SELECT ID FROM myTAble WHERE Column1 = Column2) - 1 

genannt Unter der Annahme Wenn Sie keine Übereinstimmung erhalten Sie mit dem ID am Ende -1 und diese nicht existiert also bist du ok.

Wenn es möglich ist, mehr als eine Übereinstimmung bekommen Sie haben zu prüfen, dass auch

+0

Was ist, wenn eine rückgängig gemachte Transaktion oder ein anderer Fehler Lücken in der Sequenz verursacht? Was aber, wenn jemand den Wert -1 in die Spalte einfügt ...? – onedaywhen

1

Die on-Klausel verwendet wird, um die vorherige ID abzurufen, ich habe es getestet und funktioniert einwandfrei. Diese Lösung wird auch funktionieren, wenn Zwischen ids dh ids sind missiing nicht aufeinander folgen

select t1.id, t1.column1, t1.column2, 
case 
    when (t1.column1 = t1.column2) then t2.column1 
    else null 
end as column3 
from mytable t1 
left outer join mytable t2 
    on t1.id = (select max(id) from mytable where id < t1.id) 

Für Ihre komplexe Abfrage, Sie eine Ansicht erstellen und dann das obige SQL-Format für Ihre Ansicht verwenden:

a Erstellen Ansicht MyView für:

SELECT CARDNO, NAME, TITLENAME, CARDEVENTDATE, MIN(CARDEVENTTIME) AS INTIME, MAX(CARDEVENTTIME) AS OUTTIME 
    FROM (SELECT T_PERSON.CARDNO, T_PERSON.NAME, T_TITLE.TITLENAME, T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME 
     FROM T_TITLE 
      INNER JOIN T_PERSON ON T_TITLE.TITLECODE = T_PERSON.TITLECODE 
      INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID 
      ORDER BY T_PERSON.TITLECODE) GROUP BY CARDNO, NAME, TITLENAME, CARDEVENTDATE 

Und dann würde die Abfrage sein:

select v1.CARDNO, v1.NAME, v1.TITLENAME, v1.CARDEVENTDATE, v1.INTIME, v1.OUTTIME, 
    case 
     when (v1.NAME = v1.TITLENAME) then v2.CARDEVENTDATE -- Replace v1.NAME = v1.TITLENAME with your reqd condn 
     else null end as LASTDATE, 
    case 
     when (v1.NAME = v1.TITLENAME) then v2.OUTTIME -- Replace v1.NAME = v1.TITLENAME with your reqd condn 
     else null end as LASTTIME 
from myview v1 
    left outer join myview v2 
     on v2.CARDNO = (select max(CARDNO) from table1 where CARDNO < v1.CARDNO) 

Der v1.NAME = v1.TITLENAME, falls stmt durch entsprechende condn ersetzt werden muss. Ich war mir der condn nicht sicher, da es in der Frage nicht erwähnt wird.

+0

KARTE AUSWÄHLEN, NAME, TITELNAME, KARTEVENTIDAT, INTIME, OUTTIME, LASTDATE, LASTTIME FROM (KARTE AUSWÄHLEN, NAME, TITELNAME, KARTENVENTIDAT, MIN (KARTENVENTZEIT) ALS INTIME, MAX (KARTENVENTZEIT) ALS AUSSENZEIT, KARTENVIERTEL ALS LETZTDATE, MAX (KARTENVENTZEIT) AS LASTTIME FROM (T_PERSON.CARDNO, T_PERSON.NAME, T_TITLE.TITLENAME, T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME VON (T_TITLE INNER JOIN T_PERSON AUF T_TITLE.TITLECODE = T_PERSON.TITLECODE) INNER JOIN T_CARDEVENT AUF T_PERSON.PERSONID = T_CARDEVENT.PERSONID ORDER BY T_PERSON.TITLECODE) GRUPPE BY CARDNO, NAME, TITLENAME, CARDEVENTDATE) –

+0

@Rashmi- Oben Ich habe meine Abfrage erwähnt, von dieser Abfrage, wie ich Ihre Abfrage verwenden muss, benutze Access-Datenbank. Hilfe. –

+0

Verwenden von Unterwarteschlangen. Wie muss ich deine Anfrage verwenden? –

0

Ihr Tisch ist nicht in first normal form (1NF):

Laut Definition Geburtsdatum der 1NF, eine Tabelle in 1NF ist, wenn und nur wenn es ‚isomorph zu einem gewissen Beziehung‘ ist, die Mittel, speziell, dass es die folgenden fünf Bedingungen erfüllt:

1) Es gibt keine Reihenfolge von oben nach unten zu den Zeilen.

2) Es gibt keine Reihenfolge von links nach rechts zu den Spalten.

3) ...