在论坛中出现的比较难的sql问题:5(row_number函数 分页、随机返回数据)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。



1、在inner join后,如何分页。


http://bbs.csdn.net/topics/390617884

sqlserver 对一张表进行分页查询,但是还要通过第二张表获取信息:


--比如有一张表
create table Student
(
sid int primary key identity(1,1) ,
sname varchar(15) not null
)

--第二张表
create table Comment
(
id int primary key identity(1,1) ,
sid int not null
)


我需要对第二张表comment 进行分页查询,但是还要通过第一张表查询姓名
要改如何写sql代码。
我用内连接后接下来该如何做。


我的解法:

declare @page_size int;
declare @page_num int;

--比如:每页10条记录
set @page_size = 10;

--比如:先取第1页
set @page_num = 1;

select id,sid,sname
from
(
select c.id,
       c.sid,
       s.sname,
       
       --这里按照@@servername来排序,
       --你可以根据需要按照id,sid,sname等字段来排序
       (row_number() over(order by @@servername) - 1) / @page_size as rownum
from commet c
inner join student s
        on c.sid = s.sid
)t
where rownum = @page_num - 1
由于没有实验数据,下面通过sys.objects来实现:
declare @page_size int;
declare @page_num int;

--比如:每页10条记录
set @page_size = 10;

--比如:先取第1页
set @page_num = 1;

select *
from
(
select *,   
       row_number() over(order by @@servername) as rownum,
       --这里按照@@servername来排序,
       --你可以根据需要按照id,sid,sname等字段来排序
       (row_number() over(order by @@servername) - 1) / @page_size as pagenum
from sys.objects
)t
where pagenum = @page_num - 1

--适用于sql server 2012
--也就是 从哪个offset开始,取后面的多少行
select *
from sys.objects
order by @@servername 
offset (@page_num - 1)*@page_size rows
fetch next @page_size rows only


2、group by trueName后,返回不尽相同的userName,也就是userName字段的值需要一定的随机性,然后求score的总和。

我的解法:

if object_id('tb') is not null drop table tb
go 

create table tb([id] int,[trueName] varchar(4),[userName] varchar(3),[score] int)

insert tb
select 1,'张三','zs',80 union all
select 2,'张三','zs1',100 union all
select 3,'张三','zs2',90 union all
select 1,'李四','zs',80 union all
select 2,'李四','zs1',100 union all
select 3,'李四','zs2',90

--第1次运行
select *
from
(
select truename,
       username,
       row_number() over(partition by truename order by checksum(newid())) as rownum,
       sum(score) over(partition by truename) as score
from tb
)a
where a.rownum = 1
/*
truename username rownum               score
-------- -------- -------------------- -----------
李四       zs1      1                    270
张三       zs2      1                    270
*/

--第2次运行
/*
truename username rownum               score
-------- -------- -------------------- -----------
李四       zs2      1                    270
张三       zs       1                    270
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值