男人oracle,有趣的分组函数

分组函数
记得有道sql 面试题是。以emp表为例
找出每个部门薪水的前三名。

SELECT *
  FROM (SELECT A.*, ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY JOB) RN
          FROM EMP A)
 WHERE RN <= 3;

 
这是一个分组函数的简单应用。
昨天公司要开年会,分房,标准间。两个人一间。
同事又不好说“我要和你一房”。。呵呵
来写个随机分组吧。
以emp为例。。14个人。分为7组。

SELECT B.*, MOD(ROWNUM, 7) ROOM
  FROM (SELECT A.* FROM EMP A ORDER BY DBMS_RANDOM.RANDOM) B
 ORDER BY ROOM;

 
很简单吗。呵呵。这样分完,同事可乐坏了。男女混住。哈哈
要改,一定要改
为了测试 给emp 加个sex 字段

CREATE TABLE my_emp AS SELECT * FROM emp;

ALTER TABLE my_emp ADD  sex VARCHAR2(1);

UPDATE my_emp SET sex=MOD(empno,2);

 

这回要男女分开,有利精神文明建设。哈哈

SELECT A.*,
       sex || CEIL(RANK() OVER(PARTITION BY A.SEX ORDER BY ROWNUM)/2) AS ROOM_ID
FROM (SELECT * FROM my_emp ORDER BY DBMS_RANDOM.random) A;

 
我想到了over 却没想到ceil 这是itpub szusunny 兄台写的。不错不错。

 

ENAME      SEX ROOM_ID
---------- --- -----------------------------------------
MARTIN     0   01
MILLER     0   01
ADAMS      0   02
TURNER     0   02
BLAKE      0   03
JONES      0   03
SCOTT      0   04
FORD       0   04
JAMES      0   05
CLARK      0   05
SMITH      1   11
ALLEN      1   11
WARD       1   12
KING       1   12

 

顺便囧一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值