查询日期最近的记录,方法比较

cqhweb 2012-12-03 03:53:23
--测试tb表
create table tb(
CIFSEQ integer,
EDITIONPRE integer,
EDITIONAFTER integer,
CHANGEDATE date
);

--测试数据
iinsert into tb values(13,1,0,to_date('2011-5-29 16:45:21', 'yyyy-mm-dd hh24:mi:ss'));
insert into tb values(13,0,1,to_date('2011-5-28 9:17:15', 'yyyy-mm-dd hh24:mi:ss'));
insert into tb values(11,1,0,to_date('2011-5-28 10:11:53', 'yyyy-mm-dd hh24:mi:ss'));
insert into tb values(11,0,1,to_date('2011-5-29 13:22:34', 'yyyy-mm-dd hh24:mi:ss'));
insert into tb values(15,0,1,to_date('2011-5-01 03:42:08', 'yyyy-mm-dd hh24:mi:ss'));


--测试结果如下图:



--第一种方法
select * from tb a where a.CHANGEDATE=(select max(CHANGEDATE) from tb b where a.CIFSEQ= b.CIFSEQ) order by a.cifseq;

--第二种方法
SELECT a.* FROM tb a
INNER JOIN
(
SELECT CIFSEQ,max(CHANGEDATE) as CHANGEDATE FROM tb
GROUP BY CIFSEQ
) b ON a.CIFSEQ = b.CIFSEQ AND a.CHANGEDATE = b.CHANGEDATE order by a.cifseq;

--第三种方法
select * from tb a where not exists(select 1 from tb b where a.CIFSEQ=b.CIFSEQ and b.CHANGEDATE>a.CHANGEDATE) order by a.cifseq;


以上3种方法都可以查询出相同的结果。
日期字段:CHANGEDATE,没有索引。
假设tb表在数据量百万以上的时候,请问那种方法是最优的sql或者有比以上3种方法更好的sql,请指教。
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
以学习为目的 2012-12-03
  • 打赏
  • 举报
回复
同样,给CIFSEQ字段和CHANGEDATE建立索引
xuam 2012-12-03
  • 打赏
  • 举报
回复
top 1 也可以
以学习为目的 2012-12-03
  • 打赏
  • 举报
回复
select * from tb a where not exists(select 1 from tb b where a.CIFSEQ=b.CIFSEQ and b.CHANGEDATE>a.CHANGEDATE)
  • 打赏
  • 举报
回复
建索引 给日期自断建索引 指定按照日期的降序排列 然后再用 select px=row_number()over(partition by 字段 order by 日期字段 desc) ,* from tb 取出px=1的数据即可
cqhweb 2012-12-03
  • 打赏
  • 举报
回复
--第一种方法
select *  from tb a where a.CHANGEDATE=(select max(CHANGEDATE) from tb b where a.CIFSEQ= b.CIFSEQ) order by a.cifseq;


--第二种方法
SELECT a.* FROM tb a
INNER JOIN
(
SELECT CIFSEQ,max(CHANGEDATE) as CHANGEDATE FROM tb 
GROUP BY CIFSEQ
)  b ON a.CIFSEQ = b.CIFSEQ  AND a.CHANGEDATE = b.CHANGEDATE order by a.cifseq;


--第三种方法
select * from tb a where not exists(select 1 from tb b where a.CIFSEQ=b.CIFSEQ and b.CHANGEDATE>a.CHANGEDATE) order by a.cifseq;

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧