打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL 同一个表中查询同一个字段下的多条不同记录
有这么一个数据表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)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
SQL注射笔记 access、mssql
mysql常见的面试题
WEB常见漏洞之SQL注入(靶场篇—2)
数据库原理与MySQL应用-9 MySQL数据库性能优化
DWVA-关于SQL注入的漏洞详解<SQL Injection>
MySQL中EXPLAIN命令详细解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服