SQL查询需求:按EventStamp、Type等过滤并保留对应字段
解决方案:按EventStamp筛选目标记录
要实现你需要的逻辑——同EventStamp下优先保留Type为OPR的记录;若全是DDE则保留Provider为RDSSERVER\Intouch的记录,可以用窗口函数控制优先级筛选,替代当前的UNION+DISTINCT写法,完整保留所有需要的字段:
SELECT EventStamp, TagName, Description, Area, Type, Value, Antes, Provider, Operator FROM ( SELECT EventStamp, TagName, Description, Area, Type, Value, CheckValue AS Antes, Provider, Operator, -- 设定优先级:OPR优先,符合条件的DDE次之 ROW_NUMBER() OVER ( PARTITION BY EventStamp ORDER BY CASE WHEN Type = 'OPR' THEN 1 WHEN Type = 'DDE' AND Provider = 'RDSSERVER\Intouch' THEN 2 ELSE 3 END ) AS rn FROM [dbo].[v_EventHistory] WHERE Type IN ('OPR', 'DDE') -- 仅处理目标类型 ) AS ranked WHERE rn = 1 -- 取每组内优先级最高的记录 ORDER BY EventStamp DESC;
逻辑说明:
- 优先级标记:通过
CASE语句给不同记录设定优先级,OPR类型优先级最高(标记为1),符合Provider要求的DDE标记为2,其余DDE标记为3 - 分组排序:用
PARTITION BY EventStamp将相同时间戳的记录归为一组,ROW_NUMBER()给每组内的记录按优先级编号 - 筛选目标:只保留每组内编号为1的记录,即该EventStamp下最符合要求的那条记录
内容的提问来源于stack exchange,提问作者yaqui
相关产品推荐
相关产品推荐

