关于group by 与partition by小谈,与初学者分享
关于group by 与partition by小谈,与初学者分享
首先有这么一张表雇员信息表(LARGEORDERS),有以下几个字段empid,orderid,orderdate,custid
要求:删除每位雇员最新的1000个订单
注意:带有top选项的修改、删除操作是不允许控制其逻辑顺序的
delete top(3) from LARGEORDERS order by orderdate;(这种写法是不允许的)
那是不是用一个子查询就可以做到呢?
delete from LARGEORDERS where orderdate in(select top(1000) orderdate from LARGEORDERS group by empid order by orderdate desc)
这样写显然是不正确的,因为在group by的查询语句中select 后面的字段必须在group by的分组里面存在也,这种方法就不满足了
这里group by的局限就突出了,它只能做分组后的统计数据,而不能显示分组后每组的明细数据
不如我想得到一个,根据雇员分组 每位雇员的订单表(按订单时间排序)这样的一个表的话,就不能满足要求
partition by也是做分组的
删除每位雇员最新的1000个订单
with c as(
select ROW_NUM() over(partition by empid
order by orderdate,orderid)as rownum,
empid,orderid,orderdate,custid
from LARGEORDERS
)
delete from c
where rownum<=1000;
tips:这里rownum是按orderdate,orderid排序后的行序号
partition不仅可以得到分组后的统计数据,还可以同时显示明细数据
希望对看到的友友有所帮助,我也是初学者,共同进步!!文章有什么错误可以直接指出来

浙公网安备 33010602011771号