现有结果集如下
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.