Как получить текущее значение столбца, значение предыдущего столбца - PullRequest
1 голос
/ 24 июня 2009

Как получить значение предыдущего столбца?

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

выход

id1 id2 id3(Expected)

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

и так далее ...

Я хочу отобразить предыдущее значение столбца id1

Мой запрос

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

Для LastDate - я хочу отобразить значение cardeventdate предыдущего столбца Для Lasttime - я хочу отобразить значение времени ожидания предыдущего столбца

Нужна помощь по запросу?

Ответы [ 3 ]

1 голос
/ 24 июня 2009

Предложение on используется для получения предыдущего идентификатора, я проверил его и работает нормально. Это решение будет работать, даже если промежуточные идентификаторы отсутствуют, то есть идентификаторы не являются последовательными

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)

Для сложного запроса вы можете создать представление, а затем использовать для просмотра представленный выше формат sql:

Создать представление 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)

v1.NAME = v1.TITLENAME в случае необходимости замены stmt соответствующим condn. Я не был уверен в condn, так как он не упомянут в вопросе.

0 голосов
/ 24 июня 2009

Ваша таблица не в первой нормальной форме (1NF):

Согласно определению Даты 1NF, таблица в 1NF тогда и только тогда, когда она «изоморфны некоторому отношению», которое означает, в частности, что он удовлетворяет следующие пять условий:

1) В строках нет упорядочения сверху вниз.

2) Нет упорядочения по столбцам слева направо.

3) ...

0 голосов
/ 24 июня 2009

Когда вы проектируете свою базу данных, вы должны учитывать тот факт, что вы не можете полагаться на все строки в правильном порядке. Вместо этого вы должны создать значение идентичности, которое увеличивается на единицу для каждой новой строки. И если вы сделаете это, ваше решение станет легким (или, по крайней мере, проще)

Предполагается, что новый столбец с именем ID

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

Если у вас нет совпадений, вы получите ID-1, которого не существует, так что все в порядке.

Если возможно получить более одного совпадения, вы должны учитывать это тоже

...