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

如何获取所有唯一行,并在仅一列不同的相似行中保留一行

保留唯一行(忽略指定列的重复)

需求说明

当数据表中除某一列(示例中的DeptDate)外,其余列(DeptId、DeptNo)完全相同时,仅保留任意一行数据,DeptDate可取对应组内的任意值。

示例数据

DeptIdDeptNoDeptDate
111112-09-2021
211212-09-2021
311312-09-2021
1111null
111111-09-2021

期望结果

DeptIdDeptNoDeptDate
1111任意值(如null/12-09-2021/11-09-2021)
211212-09-2021
311312-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:55:15