You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:42:59