PostgreSQL中如何按分组获取组内唯一值
如何获取分组内的唯一值
示例数据
Group | Value 1 | a 1 | b 1 | a 1 | c 2 | a 2 | b 2 | b 3 | a
期望结果
格式一:展开式(保留分组+唯一值的行)
Group | Value 1 | a 1 | b 1 | c 2 | a 2 | b 3 | a
格式二:聚合式(每个分组对应唯一值集合)
Group | Value 1 | {a,b,c} 2 | {a,b} 3 | {a}
实现方案
1. SQL 实现
生成展开式结果
直接筛选唯一的(Group, Value)组合即可,两种写法都能实现:
-- 方法1:使用 DISTINCT SELECT DISTINCT "Group", Value FROM your_table ORDER BY "Group"; -- 方法2:使用 GROUP BY SELECT "Group", Value FROM your_table GROUP BY "Group", Value ORDER BY "Group";
生成聚合式结果
通过字符串聚合函数将分组内的唯一值合并,不同数据库语法略有区别:
- MySQL 8.0+:
SELECT "Group", GROUP_CONCAT(DISTINCT Value SEPARATOR ',') AS Value FROM your_table GROUP BY "Group";
- PostgreSQL:
SELECT "Group", STRING_AGG(DISTINCT Value, ',') AS Value FROM your_table GROUP BY "Group";
- SQL Server:
SELECT "Group", STRING_AGG(DISTINCT Value, ',') WITHIN GROUP (ORDER BY Value) AS Value FROM your_table GROUP BY "Group";
2. Python Pandas 实现
假设数据已加载到DataFrame中:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Group': [1,1,1,1,2,2,2,3], 'Value': ['a','b','a','c','a','b','b','a'] })
生成展开式结果
# 方法1:删除重复的(Group, Value)行 df_unique = df.drop_duplicates(subset=['Group', 'Value']).sort_values('Group') print(df_unique) # 方法2:分组后提取唯一值再展开 df_unique = df.groupby('Group')['Value'].unique().explode().reset_index() print(df_unique)
生成聚合式结果
# 分组后聚合唯一值 df_agg = df.groupby('Group')['Value'].unique().reset_index() # 可选:将数组格式转为{...}字符串 df_agg['Value'] = df_agg['Value'].apply(lambda x: f'{{{",".join(x)}}}') print(df_agg)
内容的提问来源于stack exchange,提问作者Himanshu Singh
相关产品推荐
相关产品推荐

