口径:已并入 / 子段的到访不再计入时间线与统计(导出侧一个字节不动)
真机里两行到访可能「不独立成立」:ZMERGEDTO 指向它被并入的那条、ZPARENT 说明它只是某个 父段的一部分。app 对这两种行既不显示也不计数,本站以前当成普通到访 ⇒ 时间线上出现 「同一时刻同一地点两条」、日停留重复计入(实测数据集 9 有 64 条,26 条到达时间与原件相同)。 这些行**不能删**——导出要靠它们认这次合并发生过,所以判据只立一份 stats.SoloVisitSQL, 在读的一侧收口:visitsWhere / VisitsByPlace / Bookmarked / placeCols 子查询、首次到达城市、 地图极值点、专题(详情 + 列表批量)、三处聚合的 visit_count 与 dwell_minutes, 外加 schema.sql 一段幂等回填把存量库拉正。 天气与位移**不收口**(那几小时、那段路真实发生过);导出侧一个字节不动(rond 只读 places.last_visit_at,保持全量,压根不读 visit_count / dwell_minutes)。编辑页照样列出 这些行,但打上「已并入 #562 / 子段 #374」,免得以为数据丢了。 顺带修两个自测抓出来的问题: - ingest 的地点聚合回填排在 insertEntityRaw 之前 ⇒ 判据读到空留档 ⇒ 每行都算独立到访 (整整多算一个「已并入」的量)。 - 收口后 last_visit_at 保持全量,会凑出「0 次却有最近到访」(数据集 9 有 4 个地点), 展示侧按可见到访数兜住。 验收:304 PASS / 0 FAIL / 0 SKIP(新增 3 个用例:标记后导出仍带该行、存量回填拉正、 判据只出现在读侧)。
This commit is contained in:
@@ -558,3 +558,37 @@ END $$;
|
||||
CREATE INDEX IF NOT EXISTS idx_place_images_key ON place_images(place_key, position);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_pvv_key ON place_visitor_votes(place_key);
|
||||
|
||||
-- 已并入 / 子段到访不收进地点的到访数与停留(2026-09-29)
|
||||
--
|
||||
-- 真机里两行到访可能「不独立成立」:ZVISIT.ZMERGEDTO 指向它被并入的那条,
|
||||
-- ZPARENT 说明它只是某个父段的一部分。app 对这两种行既不单独显示也不计数,本站以前
|
||||
-- 当成普通到访 ⇒ 时间线上出现「同一时刻同一地点两条」、日停留重复计入(实测数据集 9
|
||||
-- 有 54 + 10 条,26 条的到达时间与原件完全相同)。
|
||||
--
|
||||
-- 判据与 internal/stats/stats.go 的 SoloVisitSQL 同口径,只在**读**的一侧收口:
|
||||
-- 导出的包照旧原样带着这些行(rond 靠它们认这次合并发生过),所以这里只动
|
||||
-- visit_count / dwell_minutes 两列,first_visit_at / last_visit_at 保持全量
|
||||
-- (后者会被导出成 ZLOCATION.ZLASTARRIVALDATE_)。
|
||||
--
|
||||
-- 只动「名下真有这种行」的地点,且幂等:重跑到收敛,没有这种行的库一次也不改行。
|
||||
UPDATE places p SET
|
||||
visit_count = sub.c,
|
||||
dwell_minutes = sub.d
|
||||
FROM (
|
||||
SELECT v.place_id,
|
||||
count(*) FILTER (WHERE NOT EXISTS (SELECT 1 FROM entity_raw er
|
||||
WHERE er.dataset_id = v.dataset_id AND er.entity = 'ZVISIT' AND er.src_pk = v.src_pk
|
||||
AND (er.raw->>'ZMERGEDTO' IS NOT NULL OR er.raw->>'ZPARENT' IS NOT NULL))) AS c,
|
||||
COALESCE(sum(LEAST(COALESCE(v.duration_min,0), 10080)) FILTER (WHERE NOT EXISTS (SELECT 1 FROM entity_raw er
|
||||
WHERE er.dataset_id = v.dataset_id AND er.entity = 'ZVISIT' AND er.src_pk = v.src_pk
|
||||
AND (er.raw->>'ZMERGEDTO' IS NOT NULL OR er.raw->>'ZPARENT' IS NOT NULL))), 0) AS d
|
||||
FROM visits v
|
||||
WHERE v.place_id IS NOT NULL
|
||||
GROUP BY v.place_id
|
||||
) sub
|
||||
WHERE p.id = sub.place_id
|
||||
AND EXISTS (SELECT 1 FROM visits v JOIN entity_raw er
|
||||
ON er.dataset_id = v.dataset_id AND er.entity = 'ZVISIT' AND er.src_pk = v.src_pk
|
||||
WHERE v.place_id = p.id
|
||||
AND (er.raw->>'ZMERGEDTO' IS NOT NULL OR er.raw->>'ZPARENT' IS NOT NULL));
|
||||
|
||||
Reference in New Issue
Block a user