4. 案例02

板块排名页面在早间巡检时出现异常:运营同学反馈“新能源设备”板块在综合排名榜中整体消失,既不在前50名,也搜索不到该板块的任何条目。而前一天收盘后该板块还稳定在第18位。这类“整块消失”与“排名下滑”有本质区别——排名下滑是数值变化,整块消失通常意味着该板块在进入排名计算或展示环节之前,就已经被某条规则剔除。因此排查思路不是去核对分数,而是沿着“数据是否到齐 → 是否被过滤 → 状态标识是否允许展示”这条链路逐段定位。

先判断消失发生在哪一层

第一步要区分三种可能:板块数据根本没进入计算、进入了计算但被过滤条件排除、计算完成但状态标识导致前端不展示。最直接的验证方式是查排名结果表与原始行情表的记录数对比。假设该板块下挂 42 只成分股,正常交易日应产生 42 条成分行情记录和 1 条板块聚合记录。若聚合记录缺失,问题在上游数据完整性;若聚合记录存在但排名结果表中无该板块,问题在过滤或计算;若排名结果表中有记录而页面不显示,问题在状态标识或前端查询条件。

-- 示例:核对板块聚合记录是否生成
SELECT board_code, trade_date, member_count, agg_score, status
FROM   board_agg_daily
WHERE  board_code = 'BK_NEV_001'
  AND  trade_date = '2024-06-11';
-- 返回 0 行 → 上游聚合未生成,转查成分行情完整性

本例中该查询返回 0 行,说明板块聚合记录当天没有生成,问题定位到上游。继续下钻成分行情表,发现 42 只成分股中只有 39 只有当日行情,缺失的 3 只恰好是权重最高的三只龙头股。到这里根因方向已经明确:成分行情缺失导致聚合计算的前置校验不通过,聚合任务跳过了该板块。

数据完整性:缺失阈值与静默跳过

多数排名系统的聚合任务都设有成分覆盖率校验,常见规则是“有效成分占比低于 90% 则跳过该板块聚合”。本例 39/42 ≈ 92.9%,看似高于 90%,但若系统按“权重覆盖率”而非“数量覆盖率”校验,三只龙头合计权重约 21%,权重覆盖率仅 79%,就会触发跳过。关键在于:这类跳过往往只写一条 INFO 级日志,不产生告警,于是表现为“静默消失”。排查时必须去翻聚合任务的运行日志,而不是只看任务成功状态。

排查要点:聚合任务显示“成功”不等于每个板块都成功。要检索日志中的 skip、insufficient、coverage 等关键字,确认被跳过的板块清单。

缺失的 3 只成分行情为何没到?追查行情接入日志发现,当日 09:15 该数据源发生一次重连,重连后补采任务只回溯了最近 5 分钟数据,而缺失的 3 只股票行情恰好落在重连窗口之前,补采未覆盖。这属于典型的数据接入断点未对齐问题。修复方式是将补采回溯窗口从 5 分钟扩大到 30 分钟,并增加“成分行情缺失清单”的日终核对任务。

过滤条件:被误伤的合理板块

数据补齐后重新跑聚合,板块记录生成了,但排名结果表中依然没有它。此时进入第二层排查:过滤条件。排名系统常见的过滤包括停牌股占比过高剔除、ST 股占比超限剔除、上市天数不足剔除、成交额低于阈值剔除。逐条核对发现,该板块当日有一只成分股临时停牌,停牌占比 1/42,远低于 30% 的剔除线;成交额也正常。真正的问题出在一条新上线的过滤规则上:“板块内 ST 股数量 ≥ 2 则整板不参与排名”。该板块恰有 2 只 ST 股,被整板剔除。

这条规则本身值得商榷——用绝对数量而非占比作为整板剔除条件,会让大板块更容易被误伤。合理的做法是改为 ST 股权重占比阈值,或在剔除时保留板块但标注“含风险标的”,而不是直接让其从榜单消失。本例的处理是将规则调整为“ST 股权重占比 ≥ 15% 才整板剔除”,该板块 ST 股权重合计约 4%,恢复正常参与排名。

状态标识:算出来了却不展示

还有一类消失发生在最后一公里:排名结果表里有记录,接口也返回了数据,但页面就是不显示。这通常与板块状态标识有关。板块状态一般包含正常、停牌、退市整理、数据异常、人工屏蔽等取值,前端查询往往带 status = 'NORMAL' 条件。若聚合任务在成分缺失时把板块状态置为“数据异常”,即使后续数据补齐、排名重算,状态字段若未被同步复位,板块仍会被前端过滤掉。

-- 示例:检查排名结果中的状态标识
SELECT board_code, rank_no, status, update_time
FROM   board_rank_result
WHERE  board_code = 'BK_NEV_001'
  AND  trade_date = '2024-06-11';
-- 若 status = 'DATA_ABNORMAL' 而数据已补齐,需复位为 'NORMAL' 并重算

因此完整的恢复动作应包含状态复位:数据补齐 → 重跑聚合 → 重跑排名 → 复位状态标识 → 刷新缓存。少任何一步都可能出现“数据对了但页面还是空的”。本例在复位状态并清理排名接口缓存后,板块于 10 分钟内恢复展示,排名回到第 19 位(因当日行情波动较前日略有变化)。

板块排名消失的三层排查链路 ① 数据完整性 成分行情 39/42,缺 3 只龙头 权重覆盖率 79% < 90% 聚合任务静默跳过 根因:补采窗口未覆盖断点 ② 过滤条件 停牌占比 1/42,未触发剔除 ST 股数量 = 2,命中新规则 整板被排除出排名 改为 ST 权重占比 ≥ 15% ③ 状态标识 结果表有记录,接口有返回 status = DATA_ABNORMAL 前端按 NORMAL 过滤掉 复位状态并清缓存 恢复动作链(顺序不可颠倒) 补齐缺失行情 重跑板块聚合 重跑排名计算 复位状态标识 清理接口缓存 页面恢复 异常态 板块不在榜单、搜索无结果 聚合记录 0 行 / 状态 DATA_ABNORMAL 恢复态 板块回到第 19 位,成分 42/42 齐全 状态 NORMAL,缓存已刷新

把一次性修复沉淀为可复用的排查清单

本例的价值不止于恢复一个板块,而在于把“整块消失”的排查固化为可执行动作。建议在日终核对任务中增加三项检查:成分行情覆盖率低于阈值时告警而非静默跳过;过滤规则命中清单每日输出,便于发现误伤;排名结果中状态非 NORMAL 的板块单独列出并跟踪复位。这样下一次同类问题可以在分钟级定位,而不是从页面现象开始盲猜。

常见误区:看到板块消失就直接重跑排名任务。若上游数据仍缺失或状态标识未复位,重跑只会得到同样的空结果,还会覆盖掉可用于定位问题的中间日志。应先确认消失发生在哪一层,再动手重算。

最后需要强调,三层排查有先后依赖:数据完整性是前提,过滤条件是闸门,状态标识是出口。任何一层不通,板块都无法出现在榜单上。排查时按“先看有没有、再看该不该、最后看让不让”的顺序推进,可以避免在错误的层级反复试错。