最近有个需求,有包含用户Id的表Users,包含通话记录的表MobileCalls,现在要查询表Users中某些用户联系过的通话次数最多的5个人的手机号结果集。
所以考虑了一下要使用临时表和游标。
用游标遍历表Users,根据表Users的用户Id去MobileCalls中groupby出手机号和通话次数取top5插入到临时表最后再查询临时表得到最终结果集。
实现SQL语句如下:
if object_id('tempdb..#Temp0809') is not null Begin
drop table #Temp0809--如果存在该临时表则删掉
End
CREATE TABLE #Temp0809
(
Mobile nvarchar(50)--创建临时表
)
--定义变量,用于存储当前被遍历到的值
declare @a bigint;
--递归,首先需要递归的空间,定义一个游标指向这个空间
declare mycursor cursor for select UserId from A where ... order by id asc
--打开游标
open mycursor
--开始遍历,将下一行的数据存入两个变量中
fetch next from mycursor into @a
while (@@fetch_status=0)--如果下一行还有数据
begin--开始遍历
insert into #Temp0809(Mobile) SELECT TOP 5 Mobile
FROM MobileCalls WITH(NOLOCK)
WHERE UserId = @a
GROUP BY Mobile ORDER BY SUM(Duration) DESC
fetch next from mycursor into @a--再下一行
end--遍历结构结束
close mycursor--关闭游标
deallocate mycursor--删除游标
--遍历完成
select * from #Temp0809--查询结果集
drop table #Temp0809--删除临时表
每个语句的意思都写在注释里了,可以参考一下。如果有更好的办法,请留言谢谢。