sql - 抑制Oracle sql中的重复值
问题描述
我正在使用 Oracle BIPublisher 构建一个 sql 查询。现在我的查询输出是:
ControlID Role
1 ABC
1 SJD
1 DKF
2 LLL
2 IJK
我如何编写 sql 以使输出像这样输出?
ControlID Role
1 ABC
SJD
DKF
2 LLL
IJK
*** 编辑:我能够使用 Tim 的解决方案来压制:
SELECT DISTINCT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY GRCC_CONTROL_ID ORDER BY erp_user_name) = 1
THEN GRCC_CONTROL_ID ELSE NULL END AS GRCC_CONTROL_ID ,
,role
from GRC_CTRL_AAC_INCIDENTS
ORDER BY GRCC_CONTROL_ID, role
我想用实际的控件名称替换 control_id,但那是在一个单独的表中。当我在上述查询中替换 c.name 时,我收到一条错误消息
未在预期位置找到“FROM”关键字
:
SELECT DISTINCT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY role) = 1
THEN c.name ELSE NULL END AS c.name ,
role
from GRC_CTRL_AAC_INCIDENTS
,GRC_CTRL_CCM_CONTROL_TL c
where GRCC_CONTROL_ID = c.id
ORDER BY c.name, role
解决方案
这确实是一个表示要求,因此最好在表示层中处理(例如 PHP 或 Java)。话虽如此,我们可以使用以下方法处理此问题ROW_NUMBER
:
SELECT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY ControlID ORDER BY Role) = 1
THEN ControlID ELSE NULL END AS ControlID,
t.Role
FROM yourTable t
ORDER BY
t.ControlID,
t.Role;
演示
编辑:
您使用的旧样式 pre ANSI-92 连接语法是您实际更新的查询尝试。不要那样做。相反,使用带有别名的显式连接:
SELECT DISTINCT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY role) = 1
THEN c.name ELSE NULL END AS name, -- NOT c.name
role
FROM GRC_CTRL_AAC_INCIDENTS t
INNER JOIN GRC_CTRL_CCM_CONTROL_TL c
ON t.GRCC_CONTROL_ID = c.id
ORDER BY
c.name,
role;
推荐阅读
- node.js - 有人可以帮我用useEffect()重写这段代码吗?
- java - 如何使用 Mockito 模拟在外部方法调用中设置的局部变量
- python - 音频小部件和图表未显示在 jupyter notebook 的同一区域
- reactjs - 将文件加载到 React 组件中
- c - 套接字之间基于事件的通信
- django - Django 查询集和联合
- javascript - 使用 Ag-Grid-Angular 表在 Array 中显示工具提示值
- html - Webdrivers::BrowserNotFound: 找不到 Chrome 二进制文件
- r - 将汇总字段添加到数据框 R
- python - 添加对 Python 程序的可访问性,尤其是屏幕阅读器功能