SQL group by后获取其他字段(多种方法)

本文介绍了如何在SQL中处理大量Excel数据,特别是在使用GROUP BY进行数据分组时,如何正确选择并展示所需字段的方法。提供了几种解决方案,包括利用MAX或MIN函数以及JOIN操作来获取完整的记录信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近帮朋友处理一批数据,将指定的列重复的数据拿出来。这些数据在excel里。有10W条左右。由于EXCEL不好操作。就想着将数据导入数据库通过SQL语句来操作。

导入数据库成功了,但由于SQL不是很牛,所以查询有些问题。

我用group by 把重复的拿掉,但还有个问题,大家都知道用group by的话,select 后面指定的字段必须与group by后面的一致。group by 只有个别字段,如果拿出其他未分组的字段信息呢?在网上搜了下,

总结如下:

使用了group by 之后,就要求select后面的字段包含在group by 或聚合函数里面,这时如果想读取其它字段则无法实现。

将你需要的字段放进max或min函数中,max:支持字符类型、数字类型。
select 
max(id) as id,username,password from users
group by username,password 
order by id desc

或者用:
select * from
(select part from employee group by part) as t1
inner join
(select distinct englishname from employee where part in (select part from employee group by part )) as t2
on t1.part =t2.part

参考:
select v.p ,v.a,v.b,v.c,v.d,v.e,v.f,v.g,v.h,v.i,v.j,v.k,v.l,v.m,v.m,v.n,v.o from vegaga v right join (
select min(id) as id,a,b,c,d,e,f,g,h,n from vegaga where a is not null group by a,b,c,d,e,f,g,h,n
) as v1 on v1.id=v.id order by v.id 
### 金仓 SQLGROUP BY 后使用逗号拼接字段方法 在金仓数据库中实现 `GROUP BY` 后的字段通过逗号拼接,可以采用类似于 MySQL 或其他关系型数据库中的方法。具体来说,在金仓 SQL 中可以通过内置函数来完成这一操作。 对于金仓数据库而言,如果要模拟 `GROUP_CONCAT()` 功能,则可以根据版本的不同选择合适的方式: #### 使用 `LISTAGG` 较新的金仓数据库版本支持 `LISTAGG` 函数,该函数用于将多行数据聚合为单个字符串,并允许指定分隔符。下面是一个例子说明如何利用此功能[^1]: ```sql SELECT parentuuid, LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) AS names FROM table_name GROUP BY parentuuid; ``` 这段代码会按照 `parentuuid` 对记录进行分组,并把每组内的 `name` 列值用逗号连接起来形成一个新的列 `names`。 #### 自定义解决方案 如果不支持 `LISTAGG`,则可能需要借助子查询或其他技巧来达到相同的效果。这里给出一种基于窗口函数和字符串处理函数组合的方式来构建所需的输出[^2]: ```sql WITH RankedNames AS ( SELECT parentuuid, name, ROW_NUMBER() OVER(PARTITION BY parentuuid ORDER BY name) rn, COUNT(*) OVER(PARTITION BY parentuuid) cnt FROM table_name ), ConcatenatedNames AS ( SELECT r.parentuuid, CASE WHEN r.rn = 1 THEN CAST(r.name AS VARCHAR(MAX)) ELSE '' END + STUFF(( SELECT ',' + t.name FROM RankedNames t WHERE t.parentuuid = r.parentuuid AND t.rn > 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS concatenated_names FROM RankedNames r WHERE r.rn = 1 ) SELECT cn.parentuuid, cn.concatenated_names FROM ConcatenatedNames cn; ``` 上述脚本首先创建了一个带有行编号 (`ROW_NUMBER`) 和计数器 (`COUNT`) 的中间表;接着在一个 CTE(公用表表达式)里构造最终的结果集,其中包含了按父级 UUID 分组后的名称列表,这些名称之间由逗号分隔[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值