如何按列值分组应该只出现在第一行

Posted

技术标签:

【中文标题】如何按列值分组应该只出现在第一行【英文标题】:how to make group by column value should appear at only first row 【发布时间】:2018-11-21 15:40:54 【问题描述】:

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

部门 | EMP_NAME |薪水 -----+----------+------ 10 |玛丽 | 30000 10 |约翰 | 20000 10 |斯科特 | 20000 20 |鲍勃 | 50000 20 |贝蒂 | 50000

我的目标是如下所示

部门 | EMP_NAME |薪水 -----+----------+------ 10 |玛丽 | 30000 |约翰 | 20000 |斯科特 | 20000 20 |鲍勃 | 50000 |贝蒂 | 50000

部门名称应立即出现,直到新部门开始。

【问题讨论】:

这样做需要某种排序。是什么让“shoaib”成为第一行?它可能并不总是返回的第一行,除非您有一个或多个列可供排序。 这是你不应该在 SQL 中做的事情,但在你的 GUI 层(应用程序或网站)中,你在某些网格或表格中显示数据。 我更新了我的问题。立即查看 我没有看到任何更新。 【参考方案1】:

假设您的结果按部门、员工姓名排序,您可以使用 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 的本意。你最好把这个逻辑放在显示查询结果的任何地方,而不是放在查询本身中。

【讨论】:

以上是关于如何按列值分组应该只出现在第一行的主要内容,如果未能解决你的问题,请参考以下文章

如何按列值的计数进行分组并对其进行排序?

如何在 Pandas 数据框中按列值分组

ListView 按列值分组

ListView按列值分组

按列值的前导字符对数据行进行分组

按列值查询某些行的联合和分组