【问题标题】:How to Get current column value, Previous Column Value如何获取当前列值、上一列值
【发布时间】:2010-11-05 09:41:59
【问题描述】:

如何获取上一列的值?

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 值 最后一次 - 我想显示上一列的超时值

需要查询帮助?

【问题讨论】:

标签: sql-server ms-access sql-server-2000


【解决方案1】:

on 子句用于检索之前的 id,我已经测试过它并且工作正常。 即使中间 id 缺失,即 id 不连续

,此解决方案也将起作用
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。

【讨论】:

  • SELECT CARDNO, NAME, TITLENAME, CARDEVENTDATE, INTIME, OUTTIME, LASTDATE, LASTTIME FROM (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 ON T_CARDEVENT T_PERSON.PERSONID = T_CARDEVENT.PERSONID ORDER BY T_PERSON.TITLECODE) GROUP BY CARDNO, NAME, TITLENAME, CARDEVENTDATE)
  • @Rashmi- 上面我提到了我的查询,从那个查询中我必须如何使用您的查询,正在使用访问数据库。帮助。
  • 使用子查询。我必须如何使用您的查询?
【解决方案2】:

当您设计您的数据库时,您应该考虑这样一个事实,即您不能依赖所有的行都处于正确的顺序。相反,您应该创建一个标识值,该值每增加一个新行。如果你这样做,你的解决方案就会变得容易(或者至少更容易)

假设有一个名为 ID 的新列

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

如果你没有匹配到,你最终会得到 ID -1 并且这不存在所以你没问题。

如果有可能获得不止一场比赛,您也必须考虑这一点

【讨论】:

  • 如果回滚事务或其他故障导致序列出现间隙怎么办?但是,如果有人将值 -1 插入列中怎么办?
【解决方案3】:

你的桌子不在first normal form (1NF):

根据Date对1NF的定义, 一个表在 1NF 中当且仅当它是 “与某种关系同构”,其中 具体而言,意味着它满足 以下五个条件:

1) 行没有从上到下的顺序。

2) 列没有从左到右的顺序。

3) ...

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多