关于#SQL#的问题,如何解决?

SQL数据去重问题
举例:a b c d 列

根据 bcd列分组后

如果a列中互相包含取长的 如果不包含则还取a

这个sql 能实现吗?

SQL 和 实现结果如下:

select * from test_gnn_merge_stage;

-- 数据准备:
-- 
-- a  |b  |c  |d  |
-- ---+---+---+---+
-- abc|xxx|xxx|xxx|
-- ab |xxx|xxx|xxx|
-- a  |xxx|xxx|xxx|
-- abc|yyy|yyy|yyy|
-- bce|yyy|yyy|yyy|
-- abc|zzz|zzz|zzz|
-- bce|zzz|zzz|zzz|
-- ce |zzz|zzz|zzz|

select 
  t2.*
from(
    select 
        b,
        c,
        d,
        GROUP_CONCAT(CONCAT('_',a, '_')) as a_all
    from test_gnn_merge_stage
    group by b,c,d
) t1 
join test_gnn_merge_stage t2 on t1.b = t2.b and t1.c = t2.c and t1.d = t2.d

where replace(t1.a_all, CONCAT('_',t2.a, '_'), '') not like CONCAT('%', t2.a, '%') 

-- 运行结果:
-- a  |b  |c  |d  |
-- ---+---+---+---+
-- abc|xxx|xxx|xxx|
-- abc|yyy|yyy|yyy|
-- bce|yyy|yyy|yyy|
-- abc|zzz|zzz|zzz|
-- bce|zzz|zzz|zzz|

是的,这个需求可以使用 SQL 的 GROUP BY 和 HAVING 子句来实现。

例如,你可以使用以下 SQL 查询来实现这个需求:

SELECT
  a,
  b,
  c,
  d
FROM your_table
GROUP BY b, c, d
HAVING COUNT(DISTINCT a) = 1;

这条查询会对表中的数据按照 b、c 和 d 列进行分组,然后筛选出 a 列中所有值不同的组。如果 a 列中每一组中只有一个值,那么该组就会被选中。

这样就可以实现根据 b、c 和 d 列分组后,如果 a 列中互相包含取长的,如果不包含则还取 a 的需求。

希望这个回答对你有帮助!

楼上写得有问题,你所谓得取长得是字符串得长度,还是谁得值大,取谁得

提供参考实例方法【SQL中的三种去重方法】,链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048?spm=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-10-103869048-blog-127805844.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-10-103869048-blog-127805844.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=16

是的,您可以使用 SQL 的分组和聚合函数来实现这个功能。

例如,如果您想要根据 b 和 c 列对数据进行分组,并根据 d 列中是否存在值来决定是否取 a 列的最大值,则可以使用以下 SQL 语句:

SELECT b, c,
    CASE WHEN d IS NOT NULL THEN MAX(a) ELSE a END AS a
FROM table
GROUP BY b, c

这条语句会对表中的数据按照 b 和 c 列进行分组,然后根据 d 列是否存在值来决定是否取 a 列的最大值。

如果您希望取 a 列的最小值,可以更改 MAX 为 MIN。如果您希望取 a 列的平均值,可以更改 MAX 为 AVG。

希望这个示例能帮助您理解如何使用 SQL 语句实现数据去重功能

select distinct
d1.b,d1.c,d1.d,if(instr(d1.a,d2.a) > 0,d1.a,d2.a) a
from (select b,c,d,max(a) a from table_name group by b,c,d) d1 
left join table_name d2 
on d1.b = d2.b 
and d1.c = d2.c 
and d1.d = d2.d
DECLARE @a TABLE(a VARCHAR(20),b VARCHAR(20),c VARCHAR(20),d VARCHAR(20))

INSERT @a SELECT 'asdcd','bb','cc','dd'
UNION ALL SELECT 'asd','bb','cc','dd'
UNION ALL SELECT 'ddc','bb','cc','dd'
UNION ALL SELECT 'fasdf','bb1','cc1','dd1'
UNION ALL SELECT 'asf','bb1','cc1','dd1'
UNION ALL SELECT 'sd','bb1','cc1','dd1'

SELECT b,c,d,
(SELECT TOP 1 a FROM @a WHERE b=aa.b AND c=aa.c AND d=aa.d and CHARINDEX(aa.a,a)>0 ORDER BY LEN(a) desc) new
FROM @a aa

--result
b    c    d    new
bb    cc    dd    asdcd
bb    cc    dd    asdcd
bb    cc    dd    ddc
bb1    cc1    dd1    fasdf
bb1    cc1    dd1    asf
bb1    cc1    dd1    fasdf

需要转换一下 group by a,b,c 然后通过代码逻辑实现