暂无图片
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
打赏 0
ORACLE11g

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

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

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

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

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

暂无图片 评论
暂无图片 有用 0
打赏 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
打赏 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
打赏 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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
这题选什么呢
回答 1
已采纳
C
在SQL登入界面中,在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
回答 1
已采纳
外网。首先看端口是否有映射。telnet&nbsp;端口能否通,防火墙关闭。然后要起用TCP/IP&nbsp;协议。如果用的机器名&nbsp;还是启用&nbsp;命名管道
查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。(any的用法)
回答 1
selectfromscorewherecno&x27;3105&x27;andsco&gt;(selectmin(sco)fromscorewherecno&x27;3245&x27;)orderb
Sql 64位和32位有什么区别?
回答 1
功能上没区别,性能有区别
为什么Navicat工具这么贵,还有人用?
回答 8
mark
sql查询怎么计算当列空值与非控制比例?
回答 2
已采纳
selectdecode(count(id),0,null,(count(1)count(id))/count(id))fromtid为你要查的列
通过sql文件能看出是哪个版本的mysql导出的吗?
回答 1
可以的,mysqldump导出的文件开头有记录版本信息,比如表示mysqldump版本10.13(对应mysql5.7.33)server(数据库)版本:5.7.38log
怎么获取SQL数据库的插入数据的自增ID?
回答 2
已采纳
没理解你的意思。没说数据库l类型。是要获得最大的id吗?&nbsp;可以selectmax(id)fromt
请问awr里Executions执行为0,怎么查看原因
回答 1
已采纳
通常是开始执行了,但是没有执行完。可以通过v$sqlmonitor、DBAHISTREPORTS、DBAHISTREPORTSDETAILS查看。如果没达到sqlmonitor阈值,可以通过v$act
比较长的sql,格式如: select distinct * from (select 1000+个字段的子查询),该sql在一个服务器上运行正常,在另外一个服务器运行时报:too many columns,如果去掉distinct又可以正常运行。
回答 2
很大可能性是你oracle数据库的版本不同