如何使按列分组的值应仅出现在第一行

时间:2018-11-21 15:40:55

标签: sql oracle

在oracle中,查询正在返回此数据集

DEPT | EMP_NAME | SALARY
-----+----------+-------
10   | MARY     | 30000
10   | JOHN     | 20000
10   | SCOTT    | 20000
20   | BOB      | 50000
20   | BETTY    | 50000

我的目标是做到如下

DEPT | EMP_NAME | SALARY
-----+----------+-------
10   | MARY     | 30000
     | JOHN     | 20000
     | SCOTT    | 20000
20   | BOB      | 50000
     | BETTY    | 50000

部门名称应立即显示,直到新的部门开始。

1 个答案:

答案 0 :(得分:0)

假定结果按部门,员工姓名排序,则可以使用LAG函数查找每个部门的第一行。您需要检查每一行,以查看它是否具有与上一行不同的部门,例如:

SELECT CASE /* Check if there's a different department number on this row compared to the previous row */
         WHEN NVL(LAG(t.dept) OVER (ORDER BY t.dept, t.emp_name),-1) <> t.dept /* If previous row is null (ie, this is the first row), use -1 as previous dept number so comparison does not fail */
         THEN t.dept
       END AS display_dept,
       t.emp_name,
       t.salary
FROM myTable t
ORDER BY t.dept, t.emp_name

正如其他人指出的那样,这实际上并不是SQL要做的;与在查询本身中相比,将这种逻辑用于显示查询结果的方式要好得多。