2009-06-24 8 views
1

이전 열 값을 얻는 방법? 내가 현재 열 값, 이전 열 값을 얻는 방법

ID1

이전 열 값을 disply하려는 등
id1 id2 id3(Expected) 

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

...

IIf id1 = id2 then display previous column id1 value 


id1 id2 

1001 1001 
1002 1002 
1003 1003 

...

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

출력 내 검색어

나는 Lasttime를 들어 이전 열 cardeventdate 값 을 표시 할 - - 나는

쿼리 도움이 필요 이전 칼럼 OUTTIME 값 표시 할 LastDate를 들어

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 

16,?

+0

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

+0

자세한 내용은 – gbn

+0

를 추가하십시오 당신이 이전, 컬럼 값으로 무엇을 의미합니까? – Tetraneutron

답변

0

데이터베이스를 디자인 할 때는 올바른 순서로 모든 행을 사용할 수 없다는 사실을 고려해야합니다. 대신 새로운 값을 가질 때마다 하나씩 증가하는 ID 값을 만들어야합니다. 당신이 만약이 솔루션은

는 ID라는 새로운 열을 가정하면 (적어도 또는 쉽게) 당신이 ID로 끝날 것입니다 일치를 얻을 경우 쉽게

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

-1이 존재하지 않는됩니다 그래서 너 괜찮아. 이 한 경기 이상을 얻을 수 있다면

너무

+0

롤백 트랜잭션 또는 기타 오류로 인해 시퀀스에 간격이 생기면 어떻게됩니까? 하지만 누군가가 열에 -1 값을 삽입한다면 ...? – onedaywhen

1

절이에 이전 ID를 검색하는 데 사용되는 것을 고려해야 할 것, 나는 그것을 테스트하고 잘 작동했다.

만들기 : 중간 IDS, 즉 ID를에는 missiing 경우에도이 솔루션은 작동 는 뷰를 만든 다음 뷰에 대해 위의 SQL 형식을 사용할 수, 복잡한 쿼리

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) 

연속되지 않습니다 보기 MYVIEW을 위해 : 다음

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 

그리고 쿼리는 다음과 같습니다

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) 

stmt를 적절한 condn으로 바꿔야하는 경우 v1.NAME = v1.TITLENAME. 나는 그 질문에 언급되지 않은 것에 만족하지 못했습니다.

+0

시간, 맥스 (CARDEVENTTIME) 시간대, 최장 시간, 최고 (CARDEVENTTIME)으로 CARDE, 이름, 제목, CARDEVENTDATE, INTIME, OUTTIME, LASTDATE, LASTTIME FROM (CARDNO, NAME, TITLENAME, CARDEVENTDATE, MIN (CARDEVENTTIME) (T_TITLE INNER JOIN T_PERSON ON T_TITLE.TITLECODE = T_PERSON.TITLECODE) 내부 구성원 T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID (T_TITLE.TITLECODE = T_PERSON.TITLECODE) GROUP BY CARDNO, NAME, TITLENAME, CARDEVENTDATE) –

+0

@ Rashmi- 위 내 쿼리를 언급했는데,이 쿼리에서 쿼리를 어떻게 사용해야합니까, 액세스 데이터베이스를 사용하고 있습니까? 도움. –

+0

하위 큐 사용. 어떻게 당신의 쿼리를 사용해야합니까? –

0

테이블이 first normal form에없는 (1NF) : 그것은, 수단 '어떤 관계 동형'인 경우에만 경우 1NF에 테이블 1NF의 날짜의 정의에 따르면,

, 구체적으로는 다음과 같은 5 가지 조건을 만족하는 을 만족해야합니다. 행에 대해 위에서 아래로의 순서는 없습니다.

2) 열에 왼쪽에서 오른쪽 순서가 없습니다.

3) ...