基于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
相关产品推荐
相关产品推荐

