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

SQL Server查询SiteTransactions表获取未删除活跃站点组合的方法

问题原因分析
  • 原有查询仅判断了Create操作的时间晚于同组同名站点的任意历史事务,没有校验该Create操作之后是否存在对应Delete操作,因此会返回「创建后已被删除」的站点记录,不符合筛选活跃站点的需求。
  • 业务规则允许删除后重建同名站点,因此每个SiteGroup+SiteName组合的最新一条事务类型直接决定当前状态:最新事务为Create则活跃,为Delete则已删除。
解决方案1:使用窗口函数(推荐,高效易维护)

直接对每个组合的事务按时间倒序排序,取最新一条事务,筛选类型为Create的即可:

WITH RankedTransactions AS (
    SELECT 
        SiteName,
        SiteGroup,
        TransactionType,
        TransactionTime,
        -- 同组同站点的事务按时间倒序排名,最新的排第1
        ROW_NUMBER() OVER (PARTITION BY SiteGroup, SiteName ORDER BY TransactionTime DESC) AS rn
    FROM SiteTransactions
)
SELECT SiteName, SiteGroup, TransactionType, TransactionTime
FROM RankedTransactions
WHERE rn = 1 -- 取每个组合的最新事务
  AND TransactionType = 'Create' -- 最新事务为创建则为活跃
ORDER BY TransactionTime DESC
解决方案2:调整原有自关联写法

如果需要兼容不支持CTE和窗口函数的老版本SQL Server,可以修改原自关联逻辑,判断不存在比当前Create操作更晚的同组同名站点删除操作即可:

SELECT DISTINCT A.SiteName, A.SiteGroup, A.TransactionType, A.TransactionTime
FROM SiteTransactions A
WHERE A.TransactionType = 'Create'
  -- 不存在同组同站点、时间比当前创建时间更晚的删除操作
  AND NOT EXISTS (
      SELECT 1 
      FROM SiteTransactions B 
      WHERE B.SiteGroup = A.SiteGroup 
        AND B.SiteName = A.SiteName
        AND B.TransactionType = 'Delete'
        AND B.TransactionTime > A.TransactionTime
  )
ORDER BY A.TransactionTime DESC

内容的提问来源于stack exchange,提问作者Mr.Human

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:15:02