如下表A:
id              name              date
1               薯条              2008-01-01 00:00:00
1               冰激凌            2009-02-03 12:13:34
2               dove              2008-01-05 05:12:33
2               康师傅            2009-08-06 07:56:34
2               金龙鱼            2009-07-05 09:19:19
现在同样id的,我只取一条记录,并且是取date最新的记录,请问如何取,最好是sybase数据库的语句,非常感谢
结果应该是:
id               name            date
1                冰激凌          2009-02-03 12:13:34
2                康师傅          2009-08-06 07:56:34我试过用select distinct id, name, date from A group by id order by date desc, 出来的结果根本不对
用 select distinct id, max(date) from A group by id 出来的记录也不对

解决方案 »

  1.   

    select distinct id, name, date from select * from A order by date desc
      

  2.   

    select distinct id, name, date from A  order by id, date desc
      

  3.   

     ------------------错了
    my god 
     你这个只能用程序取消把·~
     
     或者建虚表~
      

  4.   

    select distinct id, name, date from  test order by id, date desc结果:
    1 冰激凌 2009-02-03 12:13:34.000
    1 薯条 2008-01-01 00:00:00.000
    2 康师傅 2009-08-06 07:56:34.000
    2 金龙鱼 2009-07-05 09:19:19.000
    2 dove 2008-01-05 05:12:33.000你用程序取的时候先依次取 取下一条的时候判断上一条id是否相同
    相同不取
     ............................
      

  5.   

    select distinct id, name, date from A order by date desc
    这条语句出的结果是什么,我觉得差不多了!先排除ID相同的,再按照日期降序排列,不用分组啊!奇怪的是ID怎么重复?是引用的外键吗?
      

  6.   

    select distinct id, max(date) from A group by id;
    把distinct去掉。
      

  7.   

    SELECT * FROM A GROUP BY id HAVING date = MAX(date)
      

  8.   

    刚测试了下
      上面全部语句都不符合要求
    SELECT * FROM A GROUP BY id HAVING date = MAX(date)
    ----报错select distinct id, max(date) from A group by id; 
    把distinct去掉。
    ------没name  加上name 报错 楼主难道表没主键
    没主键不好弄       要有个主键的话还好弄(可能sql高手会 但是我不知道)
     ==高手
      

  9.   

    select distinct id, name, date from select * from A order by date desc
      

  10.   

    服务器: 消息 156,级别 15,状态 1,行 1
    在关键字 'select' 附近有语法错误。
      这个看来没别的方法了
     如果楼主的表没主键的话
      

  11.   

    SELECT a1.* FROM A a1 JOIN (SELECT id, MAX(date) FROM A GROUP BY id) a2 ON a1.id = a2.id AND a1.date = a2.date
      

  12.   

    SELECT a1.* 
    FROM A a1
    JOIN (SELECT id, MAX(date) date FROM A GROUP BY id) a2
    ON a1.id = a2.id AND a1.date = a2.date
      

  13.   

    本人用的mysqlselect * from A where date in (select max(date) from A group by id);
      

  14.   

    这个不行,如果数据是这个样子:id              name              date
    1              薯条              2008-01-01 00:00:00
    1              冰激凌            2009-02-03 12:13:34
    2              dove              2009-02-03 12:13:34
    2              康师傅            2009-08-06 07:56:34
    2              金龙鱼            2009-07-05 09:19:19 查询出的结果就是这个样子:id              name              date
    1              冰激凌            2009-02-03 12:13:34
    2              dove              2009-02-03 12:13:34
    2              康师傅            2009-08-06 07:56:34
      

  15.   

    我晕,想当然的加上name当然报错了,如果select里面出现,也应该同时在group by出现,改下:
    select * from A t1,
                  (select id, max(date) dat from A group by id) t2
    where  t1.id   = t2.id 
    and    t1.date = t2.dat;
      

  16.   

    还正确,晕举个反例,若id = 1的max date是2008-01-01,但是id  =1 还有一条记录是2007-01-01
    id = 2的max date是2007-01-01你猜结果会怎样?sql好好学,不要随便改人sql
      

  17.   

    另,刚查了下,sybase中不支持20楼那种子查询为表的情况,那种是oracle的写法,当然在oracle中还可以使用over()分析函数用一个sql解决,在sybase中需要变通以下:select id, max(date) dat into #temp from A group by id;
    select t1.* from A t1, #temp t2 where t1.id =  t2.id and t1.date = t2.dat;临时表只在session中有效,退出时自动销毁。
      

  18.   

    可不可以这样理解:
    {id + date 可确定这条数据的唯一性}
    ·....
    SELECT B.ID,A.NAME,B.DT FROM A A 
    LEFT JOIN (SELECT id, max(date) dt FROM A GROUP BY ID,DATE) B
    ON A.ID = B.ID AND A.DATE = B.DT
    SELECT B.ID,A.NAME,B.DT FROM A A ,(SELECT id, max(date) dt FROM A GROUP BY ID,DATE) B
    WHERE A.ID = B.ID AND A.DATE = B.DT别拍砖,俺没有测试就提交作业了。
      

  19.   


    declare @table table (id int,name varchar(6),date datetime)
    insert into @table
    select 1,'薯条','2008-01-01 00:00:00' union all
    select 1,'冰激凌','2009-02-03 12:13:34' union all
    select 2,'dove','2008-01-05 05:12:33' union all
    select 2,'康师傅','2009-08-06 07:56:34' union all
    select 2,'金龙鱼','2009-07-05 09:19:19'
    select * from @table t where 
    date=(select max(date) from @table where id=t.id) 
    order by id/*
    id          name   date
    ----------- ------ -----------------------
    1           冰激凌    2009-02-03 12:13:34.000
    2           康师傅    2009-08-06 07:56:34.000
    */
      

  20.   


    申明下,俺弄了几条特殊记录,测试结果 失败! 
    想了好长时间没想出来好的办法,如果是我,我会在程序中处理一些问题
    当然程序处理的话效率就要低的多 ,期待看到Sql语句 ;
      

  21.   

     我好像没改别人sql
       我知道sql我只知道最简单的  
    我只是在我机子上测试了下~~看正确着~~~
       
      

  22.   

    select id, max(date) from tablename group by id;
    去掉distinct就够了,因为楼主只需要最新的日期如果在select 后面加name,那么相应的,需要在group by后面也加上name,
    select id, name, max(date) from tablename group by id,name;
    但是这样就不是楼主要的结果了sql中的要求是,select后面出现的非集联函数的字段,都必须在group by中出现。因为是sybase,所以上面的绝大部分sql是不能用的。包括所有使用了select ... from tablename,
    (select ... from tablename) table的语句。在oracle中则会变的非常简单:
    select id, name, max(date) over(partition by id order by date) from tablename;
      

  23.   

    不好意思,21楼我说的有点过分。是因为改了我的sql还说是错的,有点郁闷。楼主若要得到name,可以试试24楼或者22楼的方法。不确定sybase中是否有如oracle或者db2那样的分析函数。
      

  24.   

    select * from A t1,
                  (select id, max(date) dat from A group by id) t2
    where  t1.id  = t2.id
    and    t1.date = t2.dat; 只有这个
      

  25.   

    ORACLE数据库:CREATE TABLE YFFW_TEST.T_FOODS
    (
      CODE  VARCHAR2(20 BYTE),
      ID    VARCHAR2(20 BYTE),
      NAME  VARCHAR2(20 BYTE),
      TIME  VARCHAR2(20 BYTE)
    );
    select * from T_FOODS ORDER BY CODE,ID;insert into T_FOODS values('1','1','巧克力','2009-08-14 15:00:00');
    insert into T_FOODS values('2','1','康师傅','2009-08-14 12:00:00');
    insert into T_FOODS values('3','2','德芙','2009-08-14 14:00:00');
    insert into T_FOODS values('4','2','金龙鱼','2009-08-14 13:00:00');
    insert into T_FOODS values('5','2','薯条','2009-08-14 12:32:00');
    insert into T_FOODS values('6','1','DOVE','2009-08-14 12:22:00');select S.ID,T.NAME,S.TIME from (select ID,MAX(TIME) AS TIME FROM T_FOODS GROUP BY ID) S,T_FOODS T
    WHERE T.ID = S.ID AND T.TIME = S.TIME;
      

  26.   

    select * from A where date in (select max(date) from A group by id); 
      

  27.   


    select * from A t1 where t1.date in (select max(data) from A t2 where t2.id = t1.id);
    速度会慢点...