2009-06-24 5 views
1

Comment obtenir la valeur de colonne précédente?Comment obtenir la valeur de colonne actuelle, valeur de colonne précédente

IIf id1 = id2 then display previous column id1 value 


id1 id2 

1001 1001 
1002 1002 
1003 1003 

ainsi de suite ...

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

Sortie

id1 id2 id3(Expected) 

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

ainsi de suite ...

Je veux disply valeur précédente de la colonne de ID1

Mon requête

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 

Pour la LASTDATE - Je veux afficher la colonne précédente valeur cardeventdate Pour la lastTime - je veux afficher la valeur outtime précédente colonne

Besoin Interrogation aide?

+0

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

+0

S'il vous plaît ajouter plus d'informations – gbn

+0

Que voulez-vous dire par valeur précédente de colonne1? – Tetraneutron

Répondre

0

Lorsque vous concevez votre base de données, vous devriez considérer le fait que vous ne pouvez pas compter sur toutes les lignes étant dans l'ordre. Au lieu de cela, vous devez créer une valeur d'identité qui augmente d'un pour chaque nouvelle ligne. Et si vous faites cela votre solution devient facile (ou plus facile au moins)

En supposant une nouvelle colonne appelée ID

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

Si vous ne match que vous finirez avec ID -1 et cela n'existe pas donc tu vas bien.

S'il est possible d'obtenir plus d'un match, vous devrez considérer que trop

+0

Que se passe-t-il si une transaction annulée ou une autre défaillance entraîne des écarts dans la séquence? Mais que faire si quelqu'un insère la valeur -1 dans la colonne ...? – onedaywhen

1

La clause est utilisée pour récupérer l'ID précédent, je l'ai testé et fonctionne très bien. Cette solution fonctionnera même si ids intermédiaires sont missiing-à-dire ids ne sont pas consécutifs

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) 

Pour votre requête complexe, vous pouvez créer une vue, puis utilisez le format SQL ci-dessus pour votre point de vue:

Créer une vue MyView pour:

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 

Et puis la requête serait:

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) 

La version v1.NAME = v1.TITLENAME au cas où stmt doit être remplacée par la condition appropriée. Je n'étais pas sûr du condn car il n'est pas mentionné dans la question.

+0

CHOISIR CARDNO, NOM, TITRE, CARDEVENTDATE, INTIME, HORS-TEMPS, LASTDATE, LASTTIME de (CHOISIR CARDNO, NOM, TITRE, CARDEVENTDATE, MIN (CARDEVENTTIME) COMME INTIME, MAX (CARDEVENTTIME) COMME OUTTIME, CARDEVENTDATE COMME LASTDATE, MAX (CARDEVENTTIME) AS lastTime DE (SELECT T_PERSON.CARDNO, T_PERSON.NAME, T_TITLE.TITLENAME, T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME DE (T_TITLE INNER JOIN T_PERSON SUR T_TITLE.TITLECODE = T_PERSON.TITLECODE) INNER JOIN T_CARDEVENT SUR T_PERSON.PERSONID = T_CARDEVENT.PERSONID COMMANDER PAR T_PERSON.TITLECODE) GROUPE PAR CARDNO, NOM, TITLENAME, CARDEVENTDATE) –

+0

@ Rashmi- Ci-dessus J'ai mentionné ma requête, De cette requête comment je dois utiliser votre requête, je suis en utilisant la base de données d'accès. Aidez-moi. –

+0

Utilisation de sous quies. Comment dois-je utiliser votre requête? –

0

Votre table est pas first normal form (1NF):

Selon la définition de date de 1NF, une table est en 1NF si et seulement si elle est 'isomorphe une certaine relation', qui moyens, plus précisément, il satisfait les cinq conditions suivantes:

1) Il n'y a pas d'ordre de haut en bas pour les lignes.

2) Il n'y a pas d'ordre de gauche à droite pour les colonnes.

3) ...

Questions connexes