如下表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 出来的记录也不对
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 出来的记录也不对
解决方案 »
- liferay:How to add field validation in Structure while creating Web Content?
- 求相当于history.back()的字符串
- 连接池的问题?(高手请进,在线等)
- glassfish v3 进入控制台很慢,帐户验证也很慢,正常吗?
- velocity如何使用validator
- dwr 上传到服务器就不运行了
- jsp连接sqlserver2000始终连接不上,该设置也设置了,pack4包也打了,qq:17404027
- resin3 的默认页面如何更改?
- 帮忙给分啦
- taglib的问题
- socket在action里接受jsp表单提交的数据(小女子没有分,帮帮忙。后谢)
- (急)建一个小型企业网站多少钱?
my god
你这个只能用程序取消把·~
或者建虚表~
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是否相同
相同不取
............................
这条语句出的结果是什么,我觉得差不多了!先排除ID相同的,再按照日期降序排列,不用分组啊!奇怪的是ID怎么重复?是引用的外键吗?
把distinct去掉。
上面全部语句都不符合要求
SELECT * FROM A GROUP BY id HAVING date = MAX(date)
----报错select distinct id, max(date) from A group by id;
把distinct去掉。
------没name 加上name 报错 楼主难道表没主键
没主键不好弄 要有个主键的话还好弄(可能sql高手会 但是我不知道)
==高手
在关键字 'select' 附近有语法错误。
这个看来没别的方法了
如果楼主的表没主键的话
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
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
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;
id = 2的max date是2007-01-01你猜结果会怎样?sql好好学,不要随便改人sql
select t1.* from A t1, #temp t2 where t1.id = t2.id and t1.date = t2.dat;临时表只在session中有效,退出时自动销毁。
{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别拍砖,俺没有测试就提交作业了。
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
*/
申明下,俺弄了几条特殊记录,测试结果 失败!
想了好长时间没想出来好的办法,如果是我,我会在程序中处理一些问题
当然程序处理的话效率就要低的多 ,期待看到Sql语句 ;
我知道sql我只知道最简单的
我只是在我机子上测试了下~~看正确着~~~
去掉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;
(select id, max(date) dat from A group by id) t2
where t1.id = t2.id
and t1.date = t2.dat; 只有这个
(
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;
select * from A t1 where t1.date in (select max(data) from A t2 where t2.id = t1.id);
速度会慢点...