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

数据库表按ActionCode字段去重保留单条记录的实现需求

解决同一Item下重复Event的展示问题

你当前的代码问题出在分组逻辑上——只按ActionCode(对应event枚举)分组会把所有相同事件类型的记录合并成一条,不管它们属于哪个item,这就不符合“同一item下同一event仅显示一次”的需求(不同item的相同event应该正常展示,只有同item内的重复event需要去重)。

修复步骤

  1. 确认Item标识字段:根据你的表结构,item_id对应实体类里的某个属性(比如预订IDBookingId,如果当前实体类GetBookingEventsRpcResponse里没包含这个字段,需要先补充进来,因为它是区分不同item的核心标识)。
  2. 修改分组逻辑:同时按「Item标识」和「ActionCode」作为分组键,这样只有同一个item下的相同event才会被归为一组。
  3. 保留原有展示顺序:先按原有逻辑排序(比如按EventDateTime时间排序),再分组取每组第一条,保证展示结果符合原有逻辑。

修复后的代码示例

假设Item标识是BookingId(请根据实际业务替换为你的item_id对应属性):

// 先按原有展示逻辑排序(示例为按事件时间降序,可替换为你的原有排序规则)
var sortedEvents = result.OrderByDescending(x => x.EventDateTime);

// 按Item标识+ActionCode分组,每组取第一条
var uniqueEvents = sortedEvents
                    .GroupBy(x => new { x.BookingId, x.ActionCode })
                    .Select(group => group.First())
                    .ToList();

更高效的数据库层面去重(可选)

如果数据量较大,建议直接在数据库查询阶段完成去重,减少内存处理压力。用窗口函数ROW_NUMBER()实现:

WITH RankedBookingEvents AS (
    SELECT 
        BookingEventId,
        EventDateTime,
        ActionCode,
        BookingId, -- 替换为你的item_id字段
        ROW_NUMBER() OVER (PARTITION BY BookingId, ActionCode ORDER BY EventDateTime DESC) AS RowNum
    FROM YourBookingEventsTable -- 替换为你的表名
)
SELECT BookingEventId, EventDateTime, ActionCode
FROM RankedBookingEvents
WHERE RowNum = 1;

这里的ORDER BY EventDateTime DESC对应原有展示的时间排序规则,可根据需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:45:20