如何获取所有唯一行,并在仅一列不同的相似行中保留一行
保留唯一行(忽略指定列的重复)
需求说明
当数据表中除某一列(示例中的DeptDate)外,其余列(DeptId、DeptNo)完全相同时,仅保留任意一行数据,DeptDate可取对应组内的任意值。
示例数据
| DeptId | DeptNo | DeptDate |
|---|---|---|
| 1 | 111 | 12-09-2021 |
| 2 | 112 | 12-09-2021 |
| 3 | 113 | 12-09-2021 |
| 1 | 111 | null |
| 1 | 111 | 11-09-2021 |
期望结果
| DeptId | DeptNo | DeptDate |
|---|---|---|
| 1 | 111 | 任意值(如null/12-09-2021/11-09-2021) |
| 2 | 112 | 12-09-2021 |
| 3 | 113 | 12-09-2021 |
解决方案(按数据库类型分类)
1. 通用方案(GROUP BY + 聚合函数)
适用于MySQL、PostgreSQL、SQL Server等多数数据库,通过聚合函数选取组内任意一个DeptDate值:
SELECT DeptId, DeptNo, ANY_VALUE(DeptDate) AS DeptDate FROM your_table GROUP BY DeptId, DeptNo;
- 注:
ANY_VALUE是MySQL特有的函数,其他数据库可替换为MAX(DeptDate)、MIN(DeptDate),或根据需求选择聚合逻辑。
2. PostgreSQL 特有方案(DISTINCT ON)
PostgreSQL支持DISTINCT ON语法,可快速按指定列去重:
SELECT DISTINCT ON (DeptId, DeptNo) DeptId, DeptNo, DeptDate FROM your_table ORDER BY DeptId, DeptNo; -- 若需指定保留某一行,可添加排序条件,如ORDER BY DeptId, DeptNo, DeptDate DESC
3. SQL Server/Oracle 方案(窗口函数ROW_NUMBER)
通过窗口函数为每组数据编号,仅保留编号为1的行:
-- SQL Server WITH ranked_rows AS ( SELECT DeptId, DeptNo, DeptDate, ROW_NUMBER() OVER (PARTITION BY DeptId, DeptNo ORDER BY (SELECT NULL)) AS rn FROM your_table ) SELECT DeptId, DeptNo, DeptDate FROM ranked_rows WHERE rn = 1;
-- Oracle WITH ranked_rows AS ( SELECT DeptId, DeptNo, DeptDate, ROW_NUMBER() OVER (PARTITION BY DeptId, DeptNo ORDER BY NULL) AS rn FROM your_table ) SELECT DeptId, DeptNo, DeptDate FROM ranked_rows WHERE rn = 1;
- 注:
ORDER BY (SELECT NULL)/ORDER BY NULL用于随机选取组内一行,若需指定规则(如保留最新日期),可替换为ORDER BY DeptDate DESC。
内容的提问来源于stack exchange,提问作者PotatoGod
相关产品推荐
相关产品推荐

