ORALCE中如何使结果集中的重复值只输出一次

现有结果集如下

SQL> select deptno,ename
  2  from emp
  3  order by deptno;

    DEPTNO ENAME
---------- ----------
        10 CLARK
        10 KING
        10 MILLER
        20 JONES
        20 FORD
        20 ADAMS
        20 SMITH
        20 SCOTT
        30 WARD
        30 TURNER
        30 ALLEN

    DEPTNO ENAME
---------- ----------
        30 JAMES
        30 BLAKE
        30 MARTIN

14 rows selected.

 

现在要求每个部门只有第一条员工记录输出部门编号,效果如下所示

SQL> select
  2  to_number(
  3  decode(lag(deptno) over(order by deptno),deptno,null,deptno)) deptno,
  4  ename
  5  from
  6  emp;

    DEPTNO ENAME
---------- ----------
        10 CLARK
           KING
           MILLER
        20 JONES
           FORD
           ADAMS
           SMITH
           SCOTT
        30 WARD
           TURNER
           ALLEN

    DEPTNO ENAME
---------- ----------
           JAMES
           BLAKE
           MARTIN

14 rows selected.

 

由于decode返回的是字符型,这里的to_number只是将其转换为数字型而已,并没有太大的实际意义。

在ORACLE中可以很方便的使用LAG函数,在其他DBMS中就不行了,下面给出一种比较通用的解决办法

SQL> select
  2  case when rn=1 then deptno else null end deptno,
  3  ename
  4  from
  5  (
  6  select deptno,ename,row_number() over(partition by deptno order by empno) r
n
  7  from emp
  8  );

    DEPTNO ENAME
---------- ----------
        10 CLARK
           KING
           MILLER
        20 SMITH
           JONES
           SCOTT
           ADAMS
           FORD
        30 ALLEN
           WARD
           MARTIN

    DEPTNO ENAME
---------- ----------
           BLAKE
           TURNER
           JAMES

14 rows selected.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值