昵称是**博主级**的属性,而作品是逐条刷的:一个博主只有落在采集窗口里的那几条会被 重刷,掉出窗口的老作品会一直留着旧名字。于是改名之后库里一半新一半旧 —— * 作品栏组头取的是该博主名下作品的 max(name),**恰好可能取到旧的那个**(比如从 「BBB」改成「AAA」,max 还是 BBB); * 导出和 SQL 直接看到旧名字。 两处修: 1. ingest 收完这一轮之后,把这一轮看到的 (博主, 昵称) 铺到该博主在本任务下的 **全部**作品上。带上 `!= name` 让没变化的不产生写入。只限本任务 —— 另一个任务里 的同一个人是另一条跟踪线。 2. `list_creators` 的昵称**优先取账号快照**:那一行每次采集都从资料接口重写,是 最新的一份;小红书那条路没有快照,才退回作品上的名字。 顺带把两份 SQL 里的 COALESCE 顺序调成一致(不然查出来还是旧名字)。
105 lines
5.5 KiB
SQL
105 lines
5.5 KiB
SQL
-- 抖音所有账号:最近七天有没有带「广告」标签的视频
|
|
--
|
|
-- **每个账号一行,一个都不少** —— 包括这几天没发广告的、以及一条作品都没有的号。
|
|
-- 有广告的:那一行带上「最新那条广告视频」的详情;没有的:只剩博主信息,作品列是空的。
|
|
--
|
|
-- 判定口径:
|
|
-- * 「最近七天」看的是作品的 **published_at(作者发布时间)**,不是我们什么时候采到的。
|
|
-- 想改成「最近七天新发现的」,把两处 `n.published_at >= ...` 换成
|
|
-- `n3.first_seen_at >= ...` / `n2.first_seen_at >= ...`。
|
|
-- * 广告标签按**名字**匹配(`tg.name = '广告'`)。改了标签名的话这里也要跟着改。
|
|
-- 标签是全局的(不按平台分),而这里只查抖音。
|
|
-- * 窗口下界只在**一个地方**定义(下面那个 `w` 子查询),改天数只改那一处。
|
|
-- 写成 `(UNIX_TIMESTAMP() - 7 * 86400) * 1000` 算的,**不经过时区** —— 库里存的是
|
|
-- 毫秒时间戳,和 MySQL 的 time_zone 设置无关,这样最不容易出错。
|
|
-- * MySQL 5.7 没有窗口函数,挑「最新那条」还是用相关子查询。
|
|
--
|
|
-- 只想看某一个任务:把四处 `t.platform = 'dy'` 换成 `t1.id = 7` 这类条件
|
|
-- (账号清单两处、最新广告视频子查询一处、账号快照子查询一处)。
|
|
|
|
SELECT
|
|
acct.creator_hash AS 博主哈希,
|
|
ca.alias AS 博主备注,
|
|
COALESCE(st.nickname, n.creator_name, '') AS 博主昵称,
|
|
st.fans AS 粉丝数,
|
|
st.total_favorited AS 总获赞,
|
|
st.works_count AS 主页作品数,
|
|
-- 这七天里带「广告」标签的视频有几条。0 就是没有 —— 这一行的作品列会是空的。
|
|
(SELECT COUNT(*)
|
|
FROM monitor_note n3
|
|
JOIN monitor_task t5 ON t5.id = n3.task_id
|
|
WHERE t5.platform = 'dy'
|
|
AND n3.creator_hash = acct.creator_hash
|
|
AND n3.published_at >= w.since
|
|
AND EXISTS (SELECT 1 FROM monitor_note_tag nt
|
|
JOIN monitor_tag tg ON tg.id = nt.tag_id
|
|
WHERE nt.platform = 'dy'
|
|
AND nt.note_id = n3.note_id
|
|
AND tg.name = '广告')) AS 近七天广告视频数,
|
|
n.note_id AS 作品ID,
|
|
n.title AS 作品标题,
|
|
n.note_url AS 作品链接,
|
|
FROM_UNIXTIME(n.published_at / 1000) AS 发布时间,
|
|
m.liked_count AS 点赞,
|
|
m.comment_count AS 评论,
|
|
m.collected_count AS 收藏,
|
|
m.share_count AS 分享,
|
|
(SELECT GROUP_CONCAT(t.name ORDER BY t.sort_order SEPARATOR ' / ')
|
|
FROM monitor_note_tag nt
|
|
JOIN monitor_tag t ON t.id = nt.tag_id
|
|
WHERE nt.platform = 'dy' AND nt.note_id = n.note_id) AS 标签,
|
|
(SELECT na.alias FROM monitor_note_alias na
|
|
WHERE na.platform = 'dy' AND na.note_id = n.note_id LIMIT 1) AS 作品备注
|
|
FROM
|
|
-- 七天窗口的下界(毫秒)。**改天数只改这一行。**
|
|
(SELECT (UNIX_TIMESTAMP() - 7 * 86400) * 1000 AS since) w
|
|
CROSS JOIN (
|
|
-- 账号清单:作品里出现过的
|
|
SELECT n1.creator_hash
|
|
FROM monitor_note n1
|
|
JOIN monitor_task t1 ON t1.id = n1.task_id
|
|
WHERE t1.platform = 'dy'
|
|
UNION
|
|
-- ∪ 有账号资料的(包含一条作品都没有的博主)
|
|
SELECT s1.creator_hash
|
|
FROM monitor_creator_stat s1
|
|
JOIN monitor_task t2 ON t2.id = s1.task_id
|
|
WHERE t2.platform = 'dy'
|
|
) acct
|
|
-- 这七天里最新的一条**带广告标签的**作品。没有就整块为空 —— 但博主那几列照常显示。
|
|
LEFT JOIN monitor_note n
|
|
ON n.id = (SELECT n2.id
|
|
FROM monitor_note n2
|
|
JOIN monitor_task t3 ON t3.id = n2.task_id
|
|
WHERE t3.platform = 'dy'
|
|
AND n2.creator_hash = acct.creator_hash
|
|
AND n2.published_at >= w.since
|
|
AND EXISTS (SELECT 1 FROM monitor_note_tag nt2
|
|
JOIN monitor_tag tg2 ON tg2.id = nt2.tag_id
|
|
WHERE nt2.platform = 'dy'
|
|
AND nt2.note_id = n2.note_id
|
|
AND tg2.name = '广告')
|
|
ORDER BY n2.published_at DESC, n2.id DESC
|
|
LIMIT 1)
|
|
-- 那条作品最近一轮的指标
|
|
LEFT JOIN monitor_note_metric m
|
|
ON m.id = (SELECT m2.id
|
|
FROM monitor_note_metric m2
|
|
WHERE m2.task_id = n.task_id
|
|
AND m2.note_id = n.note_id
|
|
ORDER BY m2.run_id DESC
|
|
LIMIT 1)
|
|
LEFT JOIN monitor_creator_alias ca
|
|
ON ca.platform = 'dy' AND ca.creator_hash = acct.creator_hash
|
|
-- 博主最近一轮的账号级指标
|
|
LEFT JOIN monitor_creator_stat st
|
|
ON st.id = (SELECT s2.id
|
|
FROM monitor_creator_stat s2
|
|
JOIN monitor_task t4 ON t4.id = s2.task_id
|
|
WHERE t4.platform = 'dy'
|
|
AND s2.creator_hash = acct.creator_hash
|
|
ORDER BY s2.run_id DESC
|
|
LIMIT 1)
|
|
-- 有广告的排前面(数量降序),其余按粉丝数
|
|
ORDER BY 近七天广告视频数 DESC, st.fans DESC, acct.creator_hash
|