暂无图片
SQL中,一个开窗函数问题
我来答
分享
ORACLE11g
2023-06-07
SQL中,一个开窗函数问题
暂无图片 10M


如图,怎么拿到ID=A的三条数据

有个难点就是怎么找到与ID=A重复的数据,找到后 再一次开窗就解决了吧,最好有简洁的写法。

请大佬解答

我来答
添加附件
收藏
分享
问题补充
7条回答
默认
最新
Thomas

对于需求我不是很理解,这样写行不:

select min(id),column1,column2,column3 from table group by column1,column2,column3;

暂无图片 评论
暂无图片 有用 0
ORACLE11g

不行哦,需求是ID=A,有三条数,首先column1是b1\b2\b3, column2是c1\c2\c3,column3是d1\d2\d3的为一组数据,要找到跟这组数据相符,但是ID却不同的另一组数据,然后再任意选择其一。想图下中ID=C的组数据,因为只有两条不符合,因此这个图最终结果是AC 或者 BC 的组数据。

暂无图片 评论
暂无图片 有用 0
Thomas

以ID=A的三条数据为参考,要求找出ID<>A,比如是B,同时也有三条数据,且每条数据的COLUMN1,COLUMN2,COLUMN3三列内容与ID=A的记录相同,是吧

暂无图片 评论
暂无图片 有用 0
ORACLE11g
题主
2023-06-08
是的
ORACLE11g
题主
2023-06-08
我已经写出来了,比较绕。大佬有没有简洁的写法
Thomas

你能写出来证明你就是大佬,大佬能否贴出脚本让我学习下。

暂无图片 评论
暂无图片 有用 0
ORACLE11g
题主
2023-06-08
互相学习 WITH A AS (select 'A' ID,'b1' COL1,'c1' COL2,'d1' COL3 union ALL select 'A','b2','c2','d2' union ALL select 'A','b3','c3','d3' union ALL select 'B','b1','c1','d1' union ALL select 'B','b2','c2','d2' union ALL select 'B','b3','c3','d3' union ALL select 'C','b1','c1','d1' union ALL select 'C','b2','c2','d2') -- SELECT *, -- COUNT(0)OVER(PARTITION BY ID) SN FROM A select distinct left(re,1) from (SELECT --* T1.AN, concat(t1.id,nvl(t2.id,'')), if(t1.id>t2.id, concat(t1.id,nvl(t2.id,'')), concat(nvl(t2.id,''),t1.id)) re --row_number()over(partition by t1.id order by t1.an) FROM (SELECT concat_WS('-',COL1,COL2,COL3,SN) AN ,ID FROM (SELECT *, COUNT(0)OVER(PARTITION BY ID) SN FROM A ) ) T1 LEFT JOIN (SELECT concat_WS('-',COL1,COL2,COL3,SN) AN ,ID FROM (SELECT *, COUNT(0)OVER(PARTITION BY ID) SN FROM A ) ) T2 ON T1.AN = T2.AN AND T1.ID <> T2.ID)
Thomas

select distinct id from aa t where id<>'A' and not exists (select column1,column2,column3 from aa where id='A' minus
select column1,column2,column3 from aa where id=t.id);

 

暂无图片 评论
暂无图片 有用 0
ORACLE11g
题主
2023-06-09
呃呃呃,怎么会报错,我这里跑没问题,是不是有些函数语法不一样导致的?你得换成自己数据库的函数或者语法
Thomas

我跑了你的SQL,好像报错啊:

 ) ) T2 ON T1.AN = T2.AN AND T1.ID <> T2.ID);
union ALL
*
ERROR at line 2:
ORA-00923: FROM keyword not found where expected

原始建表语句是这个对吧:

create table aa (id varchar(1),column1 varchar2(5),column2 varchar2(5),column3 varchar2(3));
insert into aa values ('A','b1','c1','d1');
insert into aa values ('A','b2','c2','d2');
insert into aa values ('A','b3','c3','d3');
insert into aa values ('B','b1','c1','d1');
insert into aa values ('B','b2','c2','d2');
insert into aa values ('B','b3','c3','d3');
insert into aa values ('C','b1','c1','d1');
insert into aa values ('C','b2','c2','d2');
commit;

暂无图片 评论
暂无图片 有用 0
Thomas

假设表里没有两条记录完全相同,那还可以如下写法,我认识的一个高手写的:

select a2.ID
from aa a1 join aa a2 on a1.id ='A' and a1.column1 = a2.column1 and a1.column2 = a2.column2 and a1.column3 = a2.column3
where a2.id<>'A'
group by a2.ID
having count(*) = (select count(*) from aa where ID = 'A');

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏