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

如何在SQL查询中处理OR条件,优先选取指定Event_Code记录

简洁实现SQL筛选逻辑:同一请求下优先取1100事件码

需求说明

从存储用户请求的表中获取记录,每个请求由[Bakasha_Number]字段标识,一个请求可对应多条不同[Event_Code]的记录(代表不同流程阶段)。要求:

  • 筛选出[Event_Code]为1100或1101的记录
  • 当同一[Bakasha_Number]同时存在这两个Event_Code时,仅保留1100的记录

原查询(含语法错误)

WITH 
    irelevant as (
    SELECT [Entity_Number] from  [HFA_M].[dbo].[IB_Entity_Events]
    where Event_Code in ('1552', '1567')) -- כל הבקשות שקיבלו קוד 1552,1567 לסינון בהמשך השאילתה

SELECT 
       ROW_NUMBER() OVER(ORDER BY [IB_Bakasha].[Tik_Binian] ASC) AS OID
      ,[IB_Bakasha].[Tik_Binian]
      ,[IB_Bakasha].[Bakasha_Number]
      ,[IB_Bakasha].[Bakasha_Description]
      ,[IB_Bakasha].[Ikari_Area]
      ,[IB_Bakasha].[Y_Diur]
      ,[IB_Bakasha].[Floors_Requested_Number]
      ,[IB_Bakasha].[Basement_Floors]
      ,[IB_Entity_Events].[Entity_Number]
      ,[IB_Entity_Events].[Event_Code]
      ,[IB_Entity_Events].[Event_Date]

      FROM [HFA_M].[dbo].[IB_Bakasha]
          -- 原语法错误:少了一个闭合方括号
          join [HFA_M].[dbo].[IB_Entity_Events] on [Bakasha_Number] = [IB_Entity_Events].[Entity_Number]
      where 
      [IB_Bakasha].[Bakasha_Number] not in (select * from irelevant)
      and ([IB_Entity_Events].[Event_Code] = '1100' or [IB_Entity_Events].[Event_Code] = '1101')
      and  [Table_Number] = '2'
      and [Maslul_Code] = '1'

简洁解决方案

用ROW_NUMBER()窗口函数按请求编号分区,给事件码排序(优先1100),再筛选每个分区的第一条记录,逻辑清晰且代码简洁:

WITH 
    -- 排除有1552/1567事件的请求
    excluded_requests as (
        SELECT [Entity_Number] 
        FROM [HFA_M].[dbo].[IB_Entity_Events]
        WHERE Event_Code IN ('1552', '1567')
    ),
    -- 对目标事件按请求编号分区,优先保留1100
    ranked_events as (
        SELECT 
            b.*,
            e.[Entity_Number],
            e.[Event_Code],
            e.[Event_Date],
            -- 按请求编号分区,Event_Code='1100'排第一
            ROW_NUMBER() OVER(PARTITION BY b.[Bakasha_Number] ORDER BY CASE e.[Event_Code] WHEN '1100' THEN 1 ELSE 2 END) AS event_rank
        FROM [HFA_M].[dbo].[IB_Bakasha] b
        JOIN [HFA_M].[dbo].[IB_Entity_Events] e ON b.[Bakasha_Number] = e.[Entity_Number]
        WHERE 
            b.[Bakasha_Number] NOT IN (SELECT * FROM excluded_requests)
            AND e.[Event_Code] IN ('1100', '1101')
            AND b.[Table_Number] = '2'
            AND b.[Maslul_Code] = '1'
    )
-- 取每个请求的第一条记录(即优先1100)
SELECT 
    ROW_NUMBER() OVER(ORDER BY [Tik_Binian] ASC) AS OID,
    [Tik_Binian],
    [Bakasha_Number],
    [Bakasha_Description],
    [Ikari_Area],
    [Y_Diur],
    [Floors_Requested_Number],
    [Basement_Floors],
    [Entity_Number],
    [Event_Code],
    [Event_Date]
FROM ranked_events
WHERE event_rank = 1
ORDER BY [Tik_Binian] ASC;

逻辑说明

  1. excluded_requests CTE:保留原查询中排除有1552/1567事件的请求的逻辑
  2. ranked_events CTE:
    • 关联请求表和事件表,过滤出1100/1101的事件
    • 用PARTITION BY b.[Bakasha_Number]按请求编号分组
    • 用ORDER BY CASE e.[Event_Code] WHEN '1100' THEN 1 ELSE 2 END让1100的记录排在同请求的1101记录前面,分配行号1
  3. 最后筛选event_rank = 1的记录,确保同一请求下仅保留优先级最高的1100(若存在),否则保留1101

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:52:49