有这么一个数据表table
ID NAME DATE TIME
1 A 2013-11-09 09:00
2 B 2013-11-09 09:01
3 C 2013-11-09 09:02
4 A 2013-11-09 09:03
6 B 2013-11-10 10:01
7 C 2013-11-10 10:02
8 A 2013-11-10 11:03
9 B 2013-11-11 10:01
10 C 2013-11-11 10:02
.
.
.
数据记录为约200万条,ID 为自增长类型,查询要求是查询NAME字段中不同的name(如A,B,C)的分别对应的最后一条记录:
比如说我查询A:则select top 1 * from table where NAME='A' order by ID desc。
这样查询的结果是CPU使用率直奔100%
现在想要实现一次时查出A、B、C等所有NAME字段中的不同的name对应的最后一条记录,然后能降低CPU的使用率
create table [table]
(ID int,
NAME varchar(10),
DATE Date,
TIME time
)
insert into [table]
select 1 ,'A', '2013-11-09', '09:00' union all
select 2 ,'B', '2013-11-09', '09:01' union all
select 3 ,'C', '2013-11-09', '09:02' union all
select 4 ,'A', '2013-11-09', '09:03' union all
select 6 ,'B', '2013-11-10', '10:01' union all
select 7 ,'C', '2013-11-10', '10:02' union all
select 8 ,'A', '2013-11-10', '11:03' union all
select 9 ,'B', '2013-11-11', '10:01' union all
select 10 ,'C', '2013-11-11', '10:02'
select ID,NAME,DATE,TIME
from
(
select *,
ROW_NUMBER() over(partition by name order by id desc) rownum
from [table]
)t
where rownum = 1
/*
ID NAME DATE TIME
8 A 2013-11-10 11:03:00.0000000
9 B 2013-11-11 10:01:00.0000000
10 C 2013-11-11 10:02:00.0000000
*/
#4
这个是第2种方法,应该会更快:
select tt.ID,tt.NAME,tt.DATE,tt.TIME
from
(
select NAME,
MAX(id) id
from [table]
group by NAME
)t
inner join [table] tt
on t.id = tt.ID
/*
ID NAME DATE TIME
8 A 2013-11-10 11:03:00.0000000
9 B 2013-11-11 10:01:00.0000000
10 C 2013-11-11 10:02:00.0000000
*/
#5
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
#6
感谢啊。我正在试
#7
速度怎么样?
#8
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下
#9
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
create table [table]
(ID int,
NAME varchar(10),
DATE Date,
TIME time
)
insert into [table]
select 1 ,'A', '2013-11-09', '09:00' union all
select 2 ,'B', '2013-11-09', '09:01' union all
select 3 ,'C', '2013-11-09', '09:02' union all
select 4 ,'A', '2013-11-09', '09:03' union all
select 6 ,'B', '2013-11-10', '10:01' union all
select 7 ,'C', '2013-11-10', '10:02' union all
select 8 ,'A', '2013-11-10', '11:03' union all
select 9 ,'B', '2013-11-11', '10:01' union all
select 10 ,'C', '2013-11-11', '10:02'
select ID,NAME,DATE,TIME
from
(
select *,
ROW_NUMBER() over(partition by name order by id desc) rownum
from [table]
)t
where rownum = 1
/*
ID NAME DATE TIME
8 A 2013-11-10 11:03:00.0000000
9 B 2013-11-11 10:01:00.0000000
10 C 2013-11-11 10:02:00.0000000
*/
#4
这个是第2种方法,应该会更快:
select tt.ID,tt.NAME,tt.DATE,tt.TIME
from
(
select NAME,
MAX(id) id
from [table]
group by NAME
)t
inner join [table] tt
on t.id = tt.ID
/*
ID NAME DATE TIME
8 A 2013-11-10 11:03:00.0000000
9 B 2013-11-11 10:01:00.0000000
10 C 2013-11-11 10:02:00.0000000
*/
#5
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
#6
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
感谢啊。我正在试
#7
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
感谢啊。我正在试
速度怎么样?
#8
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下
#9
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)