sqlserver ROW_NUMBER()OVER()详解和用法


--ROW_NUMBER()OVER(partition by 分组字段,order by 排序字段) 执行顺序要晚于 where 、group by 、order by 
--定义一个订单表
create table tb_order(
customerId nvarchar(50),
sDateTime nvarchar(50),
price decimal(18,3),
product nvarchar(50),
phoneNum nvarchar(50)
)

--插入订单数据
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('001','2019-06-01','0.5','pair','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('002','2019-06-01','0.5','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('002','2019-06-02','0.6','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('003','2019-06-01','0.5','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('003','2019-06-02','0.6','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('003','2019-06-03','0.7','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('004','2019-06-01','0.5','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('004','2019-06-02','0.6','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('004','2019-06-03','0.7','apple','15136257896')
insert into tb_order(customerId,sDateTime,price,product,phoneNum)values('004','2019-06-04','0.8','apple','15136257896')
--执行顺序:在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、  order by 的执行
select * , ROW_NUMBER()OVER(order by price ) as rank  from tb_order where product ='apple'
--排序(按单价排序并编号)
select * ,ROW_NUMBER()OVER(order by price) from tb_order

--分组排序(统计每个客户的所有订单,并根据金额进行排序、编号)
select * ,ROW_NUMBER()OVER(partition  by customerId order by price)as rank  from tb_order

--统计客户最新的订单是第几次下的订单
 with temp as(
 select * ,ROW_NUMBER()OVER(partition by customerid order by sDatetime) as rank from tb_order
 ) select customerid,max(rank) from temp group by customerid;

 --统计客户第几次下单金额最小
with temp as (
select * ,ROW_NUMBER()OVER(partition by customerid order by sDatetime) as rank from tb_order 
)select   * from temp  where price in(select min(price) from tb_order group by customerid)

--统计客户第一次下的订单
with temp as (
select * ,ROW_NUMBER()OVER(partition by customerid order by sDatetime) as rank from tb_order 
)select * from temp where rank=1
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值