select l.id, l.name, l.price, max(r.time), l.number
from table l 
join table r
    on l.time = r.time and l.id = r.id
group by l.id, l.name, l.price, l.number
没来得及试,你自己试一试吧。

解决方案 »

  1.   

    谢谢。
    l和r是什么呢,这里只有一张表proc呀。
      

  2.   

    select l.id, l.name, l.price, max(r.time), l.number
    from proc l 
    join proc r
        on l.time = r.time and l.id = r.id
    group by l.id, l.name, l.price, l.number
    自联接时要给表起别名。
      

  3.   

    oracle pl/sql语法:
    select id,name,price,time,number
      from proc x
     where time in (select max(time) from proc
                     where id = x.id);****请不要用number这样的关键字做字段名,ok?
      

  4.   

    KingSunSha(弱水三千) 
    谢谢。
    可是你的语句会不会产生这样一种情况:
    商品a在05/02/2001、03/21/2001有记录;商品b的最新记录为03/21/2001,
    列出来的结果中a会出现自己的最新记录05/02/2001和它与b最新记录同进的记录03/21/2001呢?
      

  5.   

    会的所以我用自联接
    而且联接快,
    如果要用KingSunSha的方法
    把括号中的语句改为
    select id from proc
    having time = max(time)
    group by name
    我的办法绝对没错
    不过语句的细节可能不对
    我在网吧
    没法试
    对不起
      

  6.   

    sql server :
    select id,name,price,time,number
      from proc x
     where time in (select max(time) from proc
                     where name = x.name)
    oracle:
    select id,name,price,time,number
      from proc x
     where time in (select max(time) from proc
                     where name = x.name); ccat(阿猫) 的方法是得不到要求的,因为你GROUP BY了ID,而表中的ID是唯一的。
      

  7.   

    嘿嘿,有机会给你演示一下,我以前做过这样的语句,绝对没问题
    在自联接中,有一个迪卡尔积,不Group by ID才真的会出人命
    不信你试试
    :P
      

  8.   

    那不是純是 sql 上的寫法問題.
    貨品的價格, 一般可以用
    1). 平均價格 2).早入早出(FIFO) 3). 早入遲出(FILO) 4). 標準價(Standard
    price) 等方式計算.
    舉 (FIFO)為例, 你就要用最舊的價錢來反影當時出貨價格.
    如 先入1000件的價為$10, 第2批為$15.
    當出貨時是用$10, 直至該1000件均售出, 才會是$15. 庫存價是買入總價值
    減去總出貨價.
      

  9.   

    试试这个,Sql Server
     
    SELECT id, name, price, time
    FROM proc a
    WHERE id =
              (SELECT MAX(id)
             FROM proc b
             WHERE a.name = b.name
             GROUP BY name)
      

  10.   

    runbuff(玩水的人) :
    我可以确认我写的语句是完全满足你的要求的,如果象你说的,商品a在05/02/2001、03/21/2001有记录;商品b的最新记录为03/21/2001,列出来的结果中a只会出现自己的最新记录05/02/2001,因为对商品a的查询,会加上一个判断条件:a.time = (select max(time) from b...),这个子查询会返回一个结果为05/02/2001,那就只会找到05/02/2001的纪录。明白了吗?wbsl(何苦):
    你的语句看起来不怪吗?
    select max(x)
      from proc b
     where b.name = a.name  --对每个子查询来说a.name是常量
     group by name   --那为什么还要对一个常量做group by
      

  11.   

    ccat(阿猫)的写法不对,假定有纪录
    id   name   price time        number
    345  a      1.0   05/03/2001  4
    346  a      2.0   02/01/2001  2
    347  a      3.0   11/03/2001  6
    那用如下的查询:
    select l.id, l.name, l.price, max(r.time), l.number
      from proc l join proc r
        on l.time = r.time and l.id = r.id
     group by l.id, l.name, l.price, l.number
    得到的结果将是和原纪录一模一样的。不信你做个测试。
    而且看得出来id是这个表的主键,是唯一的,用on l.time = r.time and l.id = r.id做连接其中的l.time = r.time完全是多此一举,主键都相同了,那time会不同吗?
      

  12.   

    我做过测试了
    ccat(阿猫) 不能得到正确答案
    KingSunSha(弱水三千) 不能得到正确答案(在sql里)
     Yang_(扬帆破浪) 可以得到正确答案
    以上测试所用数据为贴主所给出的数据
      

  13.   

    Yang_(扬帆破浪) 是对的,不过这样改一下可能更清晰:select *
      from proc x
     where time=(select max(time) from proc where name = x.name)