使用T-SQL从文章日志表中筛选符合指定规则的日志行
前提假设
我们默认日志表名为ArticleLogs,日志的先后顺序按自增主键Id升序判定(如果实际业务用创建时间字段排序,替换代码中对应字段即可),核心字段如下:
Id:日志主键,自增ArticleId:关联的文章唯一标识StatusId:日志状态值
T-SQL 实现代码
WITH ArticleLogStats AS ( SELECT *, -- 统计当前文章的总日志条数 COUNT(1) OVER (PARTITION BY ArticleId) AS TotalLogCnt, -- 取当前文章第一条Status=103的日志Id,不存在则为NULL MIN(CASE WHEN StatusId = 103 THEN Id END) OVER (PARTITION BY ArticleId) AS First103LogId FROM ArticleLogs ) SELECT Id -- 如需返回完整日志行,替换为*即可 FROM ArticleLogStats WHERE -- 规则1:文章仅1条日志直接返回 TotalLogCnt = 1 -- 规则2:文章日志数大于1的场景 OR ( TotalLogCnt > 1 AND ( -- 不存在Status=103的日志,返回全部 First103LogId IS NULL -- 存在Status=103的日志,仅返回该条之后的日志 OR Id > First103LogId ) ) ORDER BY ArticleId, Id;
逻辑说明
- 先用CTE给每行日志追加两个窗口统计值,避免多次关联查询,性能更优
- 筛选条件完全匹配需求规则,你给出的示例场景下:某文章有2条日志,Id为1382(StatusId=103)、1383,会命中
Id>1382的条件返回1383;另一篇文章仅有1条日志Id为284653,直接命中单条规则返回,最终正好得到你要求的两条记录。
内容的提问来源于stack exchange,提问作者Ustin
相关产品推荐
相关产品推荐

