sql - Sql 获取具有 2 个字段的重复项,但具有一个字段是唯一的
问题描述
MNO PNO PAK
33 44 T
33 44 T
33 44 K
33 45 T
33 46 T
34 46 T
34 47 T
35 47 T
你好。我在浪费时间好几个小时。我希望我能找到答案。
我想检索其中一个 mno 具有不同且不同的至少 2 个 pno 的行。并且 pak 总是应该是 t。
因此,对于给定的表,只有有效值是:
MNO PNO PAK
33 44 T
33 45 T
33 46 T
因为其他 mno 的“T”pak 没有超过 2 个不同的 pno。
我尝试这样做以获得至少 3 个有效的不同行:
SELECT distinct e1. mno,e1. pno from emq e1
INNER JOIN emq e2 on (e1.MNO=e2.MNO and e1.PNO <>e2.PNO)
INNER JOIN emq e3 on (e1.MNO=e3.MNO and e2.MNO=e3.MNO
and e1.PNO <>e3.PNO and e2.PNO <>e3.PNO)
where e1.PAK='T' and e2.PAK='T' and e2.pak='T' and exists
(SELECT distinct e4. pno,MNO from
emq e4 where e4.pak='T' group by e4. pno,MNO
having count( distinct e4. pno,HAYMNO) >2);
但它做不到。存在的部分是为每个 mno 验证至少 3 个不同的行,但不能成功。例如要测试,
选择不同的 e4。pno from emq e4 where e4.pak='T' and HAYMNO=33 group by e4. 无
我这样做了。它正确检索
44 45 46 但是当我添加计数时
having count( *) >2
解决方案
聚合和having
子句怎么样?
select mno
from emq
group by mno
having min(pno) <> max(pno) and
min(pak) = max(pak) and
min(pak) = 'T';
如果您想要原始数据,您可以使用join
, in
, 或exists
返回它们:
select emq.*
from emq join
(select mno
from emq
group by mno
having min(pno) <> max(pno) and
min(pak) = max(pak) and
min(pak) = 'T'
) m
on m.mno = emq.mno;
推荐阅读
- java - DynamoDB 中的批量更新
- std - SSCANF 怎么会提供如此奇怪的结果?
- c++ - 我可以在函数参数中推断出元组元素类型(即使用 std::tuple_element)吗?
- oracle11g - 需要在 Oracle 上按日期计算每小时记录和分组
- c# - ASP.NET Core API 版本控制 - 部分取代以前的方法版本
- java - 道房数据库无法访问
- python - 调试为什么 Dask Dataframe 操作什么都不做
- c# - 格式化字符串(掩码?)
- java - Java中的Euler项目#3;程序不输出结果
- ansible - Ansible 变量值作为变量名