作业帮 > 数学 > 作业

请教一个比较难缠的SQL查询,同一个表在不确定值的情况下,挑出重复数量等于一定个数的值

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/07/14 06:14:02
请教一个比较难缠的SQL查询,同一个表在不确定值的情况下,挑出重复数量等于一定个数的值
可能标题比较拗口,直接上数据,这样大家就可以看明白了
字段A 字段B
----------------------------------
1 a
1 b
1 c
1 d
1 e
++++++++++++++++++
2 a
2 b
2 c
2 d
++++++++++++++++++
3 a
3 b
3 c
++++++++++++++++++
4 b
4 c
4 d
要达到的要求,如果我要挑出字段B中至少三个相同的字段A的值(以B字段的abc值为例,要求取出字段A的列表为1,2,3、或者另一个bcd值去查出,1,2,4、这样出来的最终结果会是1,2,3,4)
有没有办法做到?前题是这是在前一个表里面,询问了很多人,都无法做到,
------------------------------------------------------------------------------------------------------
a和b只是现有数据体中的一部份实例,不能以这个为条件来进行查询啊,可能你还没有完全看懂我要表达的意思,我想查询的是在上面这个表中,以distinct 字段A出来的1,2,3,4,5中,字段B(字段A全为1的B清单,字段A全为2的B清单,后面以此类推),需要一个SQL来查询这些所有的B清单数据的交集数到达一定数量的值,比如上例中,可以用a,b,c来当成一个判断的依据,但这个ABC,仅在此数据集中有效,如果换成其他的值就不能再用abc了,但是他们一要是属于数据交集的,比如,aa,bb,cc,不管数据最终是什么,只要能交集到的个数到达一定数量的就显示出distinct 字段A,把这个清单列出来
我根据要求写了以下的SQL,不知道符不符合要求,
建表SQL
create table ta(
id number,
name varchar2(10)
)
insert into ta (ID,NAME)values (1,'a');
insert into ta (ID,NAME)values (1,'b');
insert into ta (ID,NAME)values (1,'c');
insert into ta (ID,NAME)values (1,'d');
insert into ta (ID,NAME)values (1,'e');
insert into ta (ID,NAME)values (2,'a');
insert into ta (ID,NAME)values (2,'b');
insert into ta (ID,NAME)values (2,'c');
insert into ta (ID,NAME)values (2,'d');
insert into ta (ID,NAME)values (3,'a');
insert into ta (ID,NAME)values (3,'b');
insert into ta (ID,NAME)values (3,'c');
insert into ta (ID,NAME)values (4,'b');
insert into ta (ID,NAME)values (4,'b');
insert into ta (ID,NAME)values (4,'d');
以下是查询B列重复最少3次a和3次b的交集123,
with a as
(select *
from (select a.name,count(*) cs
from ta a
group by a.name
having count(*) > 1) x
where x.cs >= 3
and x.name in ('a','b'))
select *
from (select h.id,count(*) ww
from ta h
where h.name in (select name from a)
group by h.id) w
where ww > 1
下面这个是结果是 1234
with a as
(select *
from (select a.name,count(*) cs
from ta a
group by a.name
having count(*) > 1) x
where x.cs >= 3
and x.name in ('a','b'))
select *
from (select h.id,count(*) ww
from ta h
where h.name in (select name from a)
group by h.id) w
感觉不太对,
另外那个
问题原话(要达到的要求,如果我要挑出字段B中至少三个相同的字段A的值(以B字段的abc值为例,要求取出字段A的列表为1,2,3、或者另一个bcd值去查出,1,2,4、这样出来的最终结果会是1,2,3,4)
前面的A出现3次的列为123没错,b出现最少3次的是1234,交集是 123
你这里的BCD是啥子意思,是B列三个特定的值
再问: and x.name in ('a', 'b')) 只处的'a','b'是不确定的
再答: 那是不是只要查出现指定次数的就可以,不要a,b就可以,
再问: a和b只是现有数据体中的一部份实例,不能以这个为条件来进行查询啊,可能你还没有完全看懂我要表达的意思,我想查询的是在上面这个表中,以distinct 字段A出来的1,2,3,4,5中,字段B(字段A全为1的B清单,字段A全为2的B清单,后面以此类推),需要一个SQL来查询这些所有的B清单数据的交集数到达一定数量的值
再答: 睡的早,醒的也早,意思我大概明白了,那我请问, 1 a 1 b 1 c 1 d 1 e ++++++++++++++++++ 2 a 2 b 2 c 2 d ++++++++++++++++++ 3 a 3 b 3 c ++++++++++++++++++ 4 b 4 c 4 d 就目前数据据来说,在字段A列为1,2,3,4的时候,B列有没有重复,请确定这个,就是下面这种情况, 1 a 1 b 1 c 1 d 1 e 1 a --B列重复 1 b --B列重复 有没有这种情况, 确定这个,我今天上班给你答案,就是不管数据多少,以a列分组,求重复出现指定次数的B列的A列的交集,对否,
再问: 谢谢高人,同一值下面,B列无重复,即同是1的字段B,肯定是唯一的
再答: with a as (select * from (select a.name, count(*) cs from ta a group by a.name having count(*) > 1) x where x.cs >= 3)--这个是重复的次数,也就指定的重复次数 select * from (select h.id, count(*) ww from ta h where h.name in (select name from a) group by h.id) w where ww > 1--这个是求交集大于表示出现次数超过2次及以上 前半部分是求重复出现的次数,后半部分是从重复出现里找交集, 请用实际数据验证是否正确,我就用了上面的数据,