SQL 同一个表中查询同一个字段下的多条不同记录

时间:2021-09-09 15:07:54
有这么一个数据表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的使用率

16 个解决方案

#1


建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247

#2


引用 1 楼 yupeigu 的回复:
建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247


引用 1 楼 yupeigu 的回复:
建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247


我用的SQL SERVER2005的数据库。还没用过split方法,学习下

#3


不好意思,上面发错帖子了哈。

试试这个:

--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
*/

#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


引用 5 楼 yupeigu 的回复:
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

感谢啊。我正在试

#7


引用 6 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

感谢啊。我正在试


速度怎么样?

#8


引用 5 楼 yupeigu 的回复:
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下

#9


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下


哦,索引建了不

#10


另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

#11


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下


对了 你用这个查询运行了多长时间,要是还觉得不快,可以改成这样试试:

select tt.ID,tt.NAME,tt.DATE,tt.TIME
from 
(
    select NAME,
           MAX(id) id
    from [table]
    group by NAME
)t
inner hash join [table] tt
        on t.id = tt.ID

#12


引用 10 楼 yupeigu 的回复:
另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率

#13


引用 12 楼 sjhxuelang 的回复:
Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

#14


引用 13 楼 yupeigu 的回复:
Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行

#15


引用 14 楼 sjhxuelang 的回复:
Quote: 引用 13 楼 yupeigu 的回复:

Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行


相当于建个临时表的意思了

#16


引用 15 楼 sjhxuelang 的回复:
Quote: 引用 14 楼 sjhxuelang 的回复:

Quote: 引用 13 楼 yupeigu 的回复:

Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行


相当于建个临时表的意思了


就是一个表

#1


建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247

#2


引用 1 楼 yupeigu 的回复:
建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247


引用 1 楼 yupeigu 的回复:
建个函数 然后分拆:

求mysql实现split的方法 
http://bbs.csdn.net/topics/240005247


我用的SQL SERVER2005的数据库。还没用过split方法,学习下

#3


不好意思,上面发错帖子了哈。

试试这个:

--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
*/

#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


引用 5 楼 yupeigu 的回复:
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

感谢啊。我正在试

#7


引用 6 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

感谢啊。我正在试


速度怎么样?

#8


引用 5 楼 yupeigu 的回复:
另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下

#9


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下


哦,索引建了不

#10


另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

#11


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 5 楼 yupeigu 的回复:

另外,由于你有200w条数据,那么可以考虑在table表上建立一个索引,可以这么建:

create index idx_table_name_id on [table](name,id)

查询结果,没问题,第二个的速度也很快,但是,CPU还是居高不下


对了 你用这个查询运行了多长时间,要是还觉得不快,可以改成这样试试:

select tt.ID,tt.NAME,tt.DATE,tt.TIME
from 
(
    select NAME,
           MAX(id) id
    from [table]
    group by NAME
)t
inner hash join [table] tt
        on t.id = tt.ID

#12


引用 10 楼 yupeigu 的回复:
另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率

#13


引用 12 楼 sjhxuelang 的回复:
Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

#14


引用 13 楼 yupeigu 的回复:
Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行

#15


引用 14 楼 sjhxuelang 的回复:
Quote: 引用 13 楼 yupeigu 的回复:

Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行


相当于建个临时表的意思了

#16


引用 15 楼 sjhxuelang 的回复:
Quote: 引用 14 楼 sjhxuelang 的回复:

Quote: 引用 13 楼 yupeigu 的回复:

Quote: 引用 12 楼 sjhxuelang 的回复:

Quote: 引用 10 楼 yupeigu 的回复:

另外,由于这个查询,会涉及到 求最大值max,和排序,会大量使用cpu,所以确实会导致cpu使用率上升的 ,但我觉得只要查询速度很快,那么对系统的影响的就会相对较小。

索引建了,原来就是这个问题,由于我这个系统查询工作基本是平均5秒执行一次,所以基本上这个CPU使用率,系统就没法正常使用了,正在看看使用内存数据库会不会提高效率



这个表的数据是实时更新的吧,可不可以考虑,直接把那个name所对应的最大的id,预先存储到另一个表中呢

这倒是个办法,不过,这样就需要不停地去修改那个表中对应的值,这样会增加数据接受线程的处理时间,要测试下,测试整个执行过程的时间,然后确定是否可行


相当于建个临时表的意思了


就是一个表