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 的分组和聚合函数来实现这个功能。
例如,如果您想要根据 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 然后通过代码逻辑实现