level 2
拜托吧里的大神帮帮忙:
现在我想实现一个功能,表A结构有三列,如下:
姓名 性别 爱好
张三 男 读书
张三 女 看报
李四 男 运动
王五 男 运动
李四 女 音乐
我想一个’姓名‘查出一条,请问应该怎么写?
目前已经试过: select distinct 姓名,性别,爱好from A。(这样会根据三个字段做去重,姓名就有重复了)
select 姓名,性别,爱好 from A group by 姓名。(报错说性别不是聚合函数,也要放在group by后面)
还有什么方法能实现只根据一列去重的功能?
2019年04月28日 05点04分
1
level 2
select group_concat(distinct 姓名)
性别
爱好
from A
group by 姓名
这种写法也试过,报错说不支持。
feature not supported; not supported aggregate function
2019年04月28日 06点04分
2
level 2
自己搞定了,虽然写法很奇怪,但是总算实现了功能:
select 姓名
max(性别)as 性别
max(爱好)as 爱好
from A
group by 姓名。
因为MAX()函数也可以作用于文本列,而对于我要的功能来说,只要‘姓名’列是唯一的,其他的列只要有值就行,所以先这么实现,有更好的方法再实验。
2019年04月28日 08点04分
4
level 2
已解决。
lt_table1 = select * from (select 姓名,性别,爱好
ROW_NUMBER()OVER(PARTITION BY 姓名 order by 性别 asc )as new_index from :lt_table)b
where b.new_index = 1;
----------------------------------------------------------------------------------------
ROW_NUMBER()OVER(PARTITION BY 姓名 order by 性别 asc )这一句表示按照‘姓名’分组,按照‘性别’排序,然后生成了新的一列叫‘new_index’,最后只取row num是1的记录。
-----------------------------------------------------------------------------------------
这样就完成了按照一个字段去重查询的功能。
2019年04月30日 10点04分
8