首页 > 解决方案 > 如何在 GROUP BY 语句中排除唯一属性

问题描述

如何在 GROUP BY 语句中包含唯一属性。例如,我们有以下表格:

MPD

MPD_ID DUMMY_ID
1 11
1 44
2 22
2 33

DUMMY_ID NUMBER_ID
11 1
22 2
33 2
44 1

数字

NUMBER_ID 数字
1 5
2 6
SELECT nr.number, dm.id FROM MPD mpd
JOIN dummy dm on mpd.dummy_id = dm.dummy_id
JOIN number nr on dm.number_id = nr.number_id
WHERE nr.number > 4
GROUP BY nr.number, dm.id
HAVING COUNT(nr.number) > 1;

搜索必须基于父对象 MPD。所以我们想根据它们所连接的 MPD 找到“重复”的 DUMMY 条目。

上面的选择将返回 0 结果,因为 ,dm.dummy_id对于所有条目都不相同,因此它不会从 GROUP BY 传递,因为 GROUP BY 需要每个条目的所有属性都相等才能对它们进行分组。

如果dm.dummy_id将被删除,则查询将正常工作,并且它将返回 DUMMY_IDs 11 和 44,因为它们各自的 dm.id 是相等的。但是将丢失有关要找到的条目的 id 的基本信息。

如何使用 group by 和 count 来识别我的重复条目,但在 select 语句中返回 dm.dummy_id?

有没有办法可以在 GROUP BY 中包含一个属性,但不要在 GROUP BY 中考虑?

标签: sqloracle18c

解决方案


我想你只想要窗口功能:

select t.*
from (select t.*, count(*) over (partition by nr) as cnt_nr
      from dummy t
     ) t
where cnt_nr > 1;

推荐阅读