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

基于ID和__EventType两列去重获取唯一行的SQL求助

解决按ID和__EventType组合去重并保留完整记录的问题

看起来你想要的是基于ID和__EventType的唯一组合来获取包含__DisplayName、EventDate、EndDate在内的完整记录,但之前的查询只返回了去重后的两列,显然没达到预期。下面给你几种实用的解决办法:

方法1:用窗口函数精准控制去重逻辑(推荐)

如果你的数据库支持窗口函数(比如SQL Server、MySQL 8+、PostgreSQL等),可以用ROW_NUMBER()给每个ID+__EventType组合的记录标记行号,然后只保留行号为1的那条:

SELECT ID, __DisplayName, __EventType, EventDate, EndDate
FROM (
    SELECT 
        ID, __DisplayName, __EventType, EventDate, EndDate,
        -- 按ID和__EventType分组,每组内按EventDate排序取第一条
        ROW_NUMBER() OVER (PARTITION BY ID, __EventType ORDER BY EventDate) AS row_num
    FROM SP_HS_Firm_Calendar_All
) AS sub_query
WHERE row_num = 1;

这里的ORDER BY EventDate是用来指定当同一个组合有多条记录时,优先保留哪一条(比如最早的事件)。你可以根据需求替换成其他排序规则,比如EndDate DESC来取最晚结束的记录。

方法2:用GROUP BY聚合(适合非关键列可做聚合的场景)

如果同一个ID+__EventType组合下,__DisplayName是固定值,或者你只需要EventDate/EndDate的极值(最早/最晚),可以用GROUP BY直接聚合:

SELECT 
    ID, 
    MAX(__DisplayName) AS __DisplayName, -- 若组合内DisplayName相同,用MAX/MIN都可以
    __EventType,
    MIN(EventDate) AS EventDate, -- 取该组合下最早的事件日期
    MAX(EndDate) AS EndDate -- 取该组合下最晚的结束日期
FROM SP_HS_Firm_Calendar_All
GROUP BY ID, __EventType;

为什么你之前的尝试没达到预期?

你之前的语句:

SELECT * FROM (select distinct ID, __EventType from SP_HS_Firm_Calendar_All);

本质上只返回了ID和__EventType的唯一组合,完全没涉及你需要的其他列,自然得不到包含完整字段的目标结果。


内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:45:56