删除SQL中合并后的重复项



我有三个表(t1, t2和t3)。见下文:

第一个表:

ID          AMOUNT
1              100
2              50

第二个表:

ID          TYPE
1              A
2              B

第三个表:

TYPE          GRADE
A              X
B              Y
B              Z

我们首先通过ID对t1和t2进行了内连接,然后通过TYPE对t2和t3进行了内连接。

SELECT 
t1.ID as ID, 
t1.AMOUNT as AMOUNT, 
t2.TYPE as TYPE,
t3.GRADE as GRADE
FROM t1 
INNER JOIN t1 ON t1.ID=t2.ID
INNER JOIN t2 ON t2.TYPE=t3.TYPE

最终表

ID          AMOUNT          TYPE          GRADE
1              100           A            X   
2              50            B            Y 
2              50            B            Z

我需要按ID和TYPE检查重复项,如果总记录>1,我需要删除那些与GRADE = z

所以最终期望的输出应该是
ID          AMOUNT          TYPE          GRADE
1              100           A            X   
2              50            B            Y 

如果有超过两行相同的ID和Type会发生什么?查询应该返回除z级以外的所有值。使用下面的查询来实现。

我在你的查询中添加了一个名为"rownumber"将每行按编号和类型按等级顺序编号。这意味着具有相同ID和Type的每一行将具有从1开始的序列号。此顺序将按年级升序进行。然后,我使用公共表表达式,在where子句中,我为每个id和类型(行号为1)以及行号为>1和等级为<>'z'的所有行选择了第一行,以消除任何等级为" z "的行。其中IT和Type至少有一行已经存在。

create table t1 (ID          int ,AMOUNT int)
insert into t1 values(1             , 100)
insert into t1 values(2              ,50)

create table t2(ID          int ,Type varchar(10))
insert into t2 values(1,              'A')
insert into t2 values(2              ,'B')



Create table t3 ([Type] varchar(10), grade varchar(10))
insert into t3 values('A',              'X')
insert into t3 values('B',              'Y')
insert into t3 values('B',              'Z')
insert into t3 values('B',              'X')


with cte as(
SELECT 
t1.ID as ID, 
t1.AMOUNT as AMOUNT, 
t2.TYPE as TYPE,
t3.GRADE as GRADE,
row_number()over (partition by t1.id,t2.type  order by grade) rownumber
FROM t1 
INNER JOIN t2 ON t1.ID=t2.ID
INNER JOIN t3 ON t2.TYPE=t3.TYPE)
select id,AMOUNT,type,grade,rownumber from cte where rownumber=1 or (rownumber>1 and GRADE<>'Z')
SELECT 
t1.ID as ID, 
t1.AMOUNT as AMOUNT, 
t2.TYPE as TYPE,
MIN(t3.GRADE) as GRADE
FROM t1 
INNER JOIN t1 ON t1.ID=t2.ID
INNER JOIN t2 ON t2.TYPE=t3.TYPE
GROUP BY t1.ID,
t1.AMOUNT,
t2.TYPE

它的作用是在Grade列上执行聚合函数,然后消除其他列中的重复项。

最新更新