有这么一个数据表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的使用率
试试这个:
SQL code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--drop table [table]
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
*/
对我有用[0] 丢个板砖[0] 引用 |
举报 | 管理
关注yupeigu 不想长大啊
本版等级:
更多勋章#4 得分:40回复于: 2013-12-08 19:13:00
这个是第2种方法,应该会更快:
SQL code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
*/
对我有用[0] 丢个板砖[0] 引用 |
举报 | 管理
关注yupeigu 不想长大啊
本版等级:
更多勋章#5 得分:0回复于: 2013-12-08 19:14:49
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:
create index idx_table_name_id on [table](name,id)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。