关于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不仅可以得到分组后的统计数据,还可以同时显示明细数据

希望对看到的友友有所帮助,我也是初学者,共同进步!!文章有什么错误可以直接指出来

posted @ 2011-09-07 14:22  菜鸟的博客  阅读(547)  评论(0)    收藏  举报