2021-09-22

年轻人的“社交新宠”剧本杀,已悄然形成一个市场规模超百亿的新兴产业,引来大量淘金者。他们之中除了剧本创作者、店主、DM(主持人)之外,还有这样一群人——

他们是剧本杀资深爱好者,同时也是互联网极客。他们为剧本杀店家和玩家开发小程序,做“剧本杀SaaS”,每个月仅花费几百元的云开发费用,便可开发和维护数千个微信小程序,服务数千家剧本杀店,营业额最多时超过700万/年。

“玩哭了。”

提到剧本杀,不少人都有这样的回忆。

一个特定主题的房间,三五好友,在DM(主持人)的引导下,根据自己拿到的剧本扮演一个假定的角色,在虚拟情境中,与不同的人发生交集,共同完成任务,这就是剧本杀。

猫猫是一名大学生,她从2019年开始接触剧本杀,“市面上主流的本基本都看过”。2020年,猫猫家人看到剧本杀的巨大市场需求,也开了一家线下的剧本杀实体店,她也尝试做过主持人。

很多主打情感的剧本都是沉浸式的,玩家进入角色后,很容易“上头”。猫猫的一个朋友去玩剧本杀,有男朋友的她,在过程中跟游戏中另一位不相识的男生扮演CP,结果“成功”分手。

这种听起来匪夷所思的情节,在剧本杀的局中并不罕见。理解不了上面的故事,可能很难理解剧本杀。

深圳一家主打沉浸式体验的连锁剧本杀店“314剧幕”的一名店长告诉我们,有一些重度玩家,只要店里到了新本就会来玩,“有时甚至连续几天都来”。

线下剧本杀人均消费在100-200元,根据剧本属性、道具和场景略有高低,每一局的参与人数在4-10人不等。换言之,一场剧本杀带来的营业收入能达到千元左右,非常有吸引力。

目标人群强大的消费力使得剧本杀成为了不少创业者的淘金热土。数据显示,中国“剧本杀”行业市场规模已突破100亿元,截至2020年年底,全国剧本杀相关实体店已突破30000家

剧本杀SaaS创业“掘金记”

2019年,无锡。

一直关注互联网创业的沈海洋迷上了剧本杀,经常去店里玩。当时的沈海洋烦恼不少,自己是做设计出身,在做内容电商相关的创业,但总感觉“虽然赶上了公众号的风口,却没抓住机会,有些迷茫”。

在一次次剧本杀的局中,出于职业习惯,他注意到,大部分剧本杀店都没有线上系统和工具,用户体验非常不好。

一个深夜,又一次从剧本杀中回到现实的沈海洋突然想到:能否为剧本杀店做一个类似餐厅扫码点单的工具?一方面可以服务玩家,另一方面也方便店家管理。

他去网上搜索了一下剧本杀店的数量——已经超过一万家,并且还在迅猛增长。沈海洋有些激动,“SaaS创业虽是一片红海,但是剧本杀这样小而美的SaaS大有可为!”

凭借工作经验和已有的技术条件,要在剧本杀这个垂直方向上做SaaS开发不是难事:产品的逻辑大同小异,难的是识别行业的真正需求,并找到简单易用且性价比最高的开发工具来实现。

由于此前使用过腾讯云和微信联合打造的云开发服务,加上对微信生态的看中,沈海洋自然地打算以开发剧本杀微信小程序作为突破口。

就这样,属于沈海洋的剧本杀SaaS创业“掘金记”迅速启动了。

1000元/年 VS. 7000000元/年

7天之内,从0到1上线一个小程序。

基于云开发,小程序的搭建可以在非常短的时间内完成。沈海洋介绍:“5-10分钟就可以实现小程序从无到有,基本能用,这也是腾讯云开发和微信小程序给我们带来的一个红利。”

同时,这也为快速验证创业想法和促成产品迭代创造了条件。而当业务逻辑梳理完成、模版固定下来后,复制起来就更简单了。

谈到技术选择,沈海洋说,近年来兴起的云开发技术对于创业者来说非常友好,有很多不同的功能接口,使用起来比较方便。并且,自动扩容的云托管功能可以在业务低谷期减少不必要的成本,高峰期又可以快速扩容,抵御高访问、高并发的问题,性价比很高。

另外,云开发的批量代开发能力也可以让服务商帮客户快速批量开发小程序。

最为关键的是,在项目启动阶段,这些服务面向开发者是免费的,方便开发者用免费的资源进行试错。“如果产品开发出来,没有什么用户,也不会有太大的损失”。

目前,沈海洋的“趣做局”小程序服务的店家超过8000家,每年的营业额超过700万

和最初的设想一样,小程序分别为玩家和店家服务,对于玩家来说,可以通过小程序满足了解剧本、注册会员、扫码支付、剧本预约等需求;对于店家来说,小程序背后还有一整套的店面管理系统,可以进行会员管理、营销活动展示、数据统计、员工管理等工作。

这些是剧本杀SaaS的1.0版本。最近,沈海洋开始规划小程序2.0版本,计划将剧本杀产业链上包括剧本创作、发行、DM招募等节点中可以线上化的部分进行深化,打造一个覆盖全产业链条的小程序。

“内卷”的剧本杀正在经历洗牌

从2016年兴起至今,剧本杀在国内经历了从小众到爆发的五年,当前行业内的一个共识是——剧本杀正处于洗牌阶段,“内卷严重”。

看见开店赚钱了,所有人一窝蜂涌过来;觉得写剧本赚钱了,除了店家之外,各类作家、剧作者、编辑纷至沓来。这造成了一个现象,市面上的剧本质量参次不齐,质量高的本子“一本难求”。

剧本自身的属性会加剧行业的洗牌——剧本分为三种类型,第一种是盒装,每个店家都可以买;第二种是城市限定;还有一类“独家”剧本,成为大家争抢的流量入口。

用沈海洋的话说,主持人的质量决定了一家店的上限,剧本的质量决定了它的下限。剧本杀的核心还是在用户体验,除了剧本,大家对优秀主持人的争夺也非常厉害。“未来肯定是专业的、服务质量高和往连锁化的方向走的店胜出”。

在许多剧本杀创业者的设想中,有了小程序这样的数字化工具,剧本的选择和购买就有了更多依据。

基于数千家剧本杀店,小程序现在有一个数据功能,可以看到哪些剧本在实体店中被添加得最多、最受欢迎,这成为了新店选购剧本的决策参考。

得益于云资源,小程序的价格也非常亲民,“趣做局”定价不超过1000元/年。对于启动资金动辄超过几十万的剧本杀店来说,开发小程序的价格相当低廉。

另一方面,剧本杀SaaS服务创业者也在不断加深对行业和技术的理解,希望能不断扩展业务边界。剧本杀行业因与文娱、消费、IP的强关联性,自身有着较强的内容扩展能力,行业的天花板很高,这也为剧本杀SaaS服务商带来了更多的想象空间。

最近,沈海洋已经见了好几波风险投资人。他脑海中筹划着下一步,“现在公司整体能盈利,更多考虑的还是资源上的补充”。

“遍地都是淘金者的年代,售卖铁锹就可以发财”。

从盲盒到剧本杀,新的消费和商业形式层出不穷,简洁易用的云技术为创业者提供了更多选择,特别是微搭低代码等更加上层的新技术出现,也让沈海洋这样的创业者得以利用技术的红利,在剧本中成功淘金。

下一个剧本杀,会在哪里?

不确定。但不妨带上云开发和微搭一起。

创业者的每一次尝试,都有可能创造奇迹。

我们来逐步分析你提出的问题,先从 SQL 语句的逻辑入手,再解释为什么会出现 `null` 值,以及为什么在“9-15”这一行中窗口函数返回的是 `2021-06-21`(比当前行的结束时间还大),最后给出正确计算每个品牌**去重后总打折天数**的方法。 --- ### ✅ 你的SQL语句是: ```sql SELECT brand, stt, edt, MAX(edt) OVER ( PARTITION BY brand ORDER BY stt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS maxEdt FROM test4; ``` 作用:对每个品牌的促销活动按开始日期排序,然后为每一行计算 **之前所有行中最大的结束日期(edt)**。 --- ## 🔍 问题1:为什么第一行 `maxEdt` 是 `null`? 看 redmi 的第一条记录: ``` redmi 2021-06-05 2021-06-21 null ``` 因为这是一组(brand=redmi)中的**第一行**。 窗口定义是: > `ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING` 意思是:“从该分组的第一行到当前行的前一行”。 但当前行是第一行,它前面没有数据 → 所以前面的行集合为空集 → `MAX(edt)` 在空集上运算结果为 `NULL`。 ✅ **结论**:第一个活动没有“之前的活动”,所以 `maxEdt = NULL` 是正常的。 --- ## 🔍 问题2:为什么第二行(2021-06-092021-06-15)的 `maxEdt = 2021-06-21`? 看第二条 redmi 记录: ``` redmi 2021-06-09 2021-06-15 2021-06-21 ``` 注意!虽然当前行的 `edt=2021-06-15`,但它的 `maxEdt` 来自于前面所有行的最大 `edt`,也就是第一行的 `edt=2021-06-21`。 ⚠️ 关键点: 窗口函数 `MAX(edt)` 是取历史行中 `edt` 字段的值,并不是和当前行有关。 即使当前行的 `edt` 较小(如 6月15日),只要前面某行的 `edt` 更晚(如 6月21日),就会被保留下来。 所以这里 `maxEdt = 2021-06-21` 是完全正确的。 💡 这个值的意义是:**在当前这次活动开始之前,该品牌最后一次可能还在打折的时间点(即最大结束日)**。 这个技巧常用于判断是否有时间重叠! --- ## ✅ 如何用这个字段判断是否连续或重叠? 我们可以利用 `maxEdt` 和当前行的 `stt` 比较: - 如果 `stt <= maxEdt`:说明当前活动与前面某个活动有重叠或紧接 → 可以合并 - 否则:中间有空档 → 不连续,需要新开一个区间 这是典型的“合并区间”问题,在数据库中可通过以下方式解决: --- ## ✅ 正确解法:计算每个品牌去重后的总打折天数(处理交叉日期) ### Step 1: 排序并找出是否属于同一连续区间(使用 `start_gap_flag`) ```sql WITH ordered_data AS ( SELECT brand, stt::date, edt::date FROM test4 ), marked_gaps AS ( SELECT brand, stt, edt, -- 如果当前开始时间 > 之前所有活动的最大结束时间,则说明断开了 CASE WHEN stt > MAX(edt) OVER ( PARTITION BY brand ORDER BY stt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) THEN 1 ELSE 0 END AS is_new_period FROM ordered_data ), -- Step 2: 使用累计标志划分不同的连续区间 grouped_periods AS ( SELECT brand, stt, edt, SUM(is_new_period) OVER ( PARTITION BY brand ORDER BY stt ROWS UNBOUNDED PRECEDING ) AS period_id FROM marked_gaps ), -- Step 3: 对每个 period 取最小 stt 和最大 edt(即合并后的区间) merged_periods AS ( SELECT brand, MIN(stt) AS period_stt, MAX(edt) AS period_edt FROM grouped_periods GROUP BY brand, period_id ) -- Step 4: 计算每个品牌总的不重复天数 SELECT brand, SUM(period_edt - period_stt + 1) AS total_discount_days FROM merged_periods GROUP BY brand ORDER BY brand; ``` --- ### 📌 代码解释: 1. **`ordered_data`**:确保日期类型为 `date`,避免字符串比较出错。 2. **`marked_gaps`**: - 使用窗口函数获取此前所有区间的最大结束日。 - 若当前开始日 > 此前最大结束日 → 新周期开始(`is_new_period = 1`)。 3. **`grouped_periods`**: - 利用 `SUM(...) OVER (...)` 构造唯一 `period_id`,将连续或重叠的区间归为一组。 4. **`merged_periods`**: - 按 `brand + period_id` 分组,取每段的起止时间。 5. **最终统计**: - 每个合并区间的天数 = `end - start + 1`(包含首尾)。 - 累加得到各品牌总天数。 --- ### 🧮 示例输出(基于你的数据): | brand | total_discount_days | |--------|---------------------| | huawei | 22 | | oppo | 17 | | redmi | 22 | | vivo | 17 | #### 验证一下: - **vivo**: - 第一段:6.5 ~ 6.15 (11天) - 第二段:6.9 ~ 6.21(重叠了6.9~6.15) - 合并后:6.5 ~ 6.21 → 共 17 天 ✅ - **redmi**: - 6.5~6.21,6.9~6.15(完全包含),6.17~6.26 - 前两段已覆盖到6.21,第三段6.17 < 6.21 → 重叠 - 合并为 6.5 ~ 6.26 → 共 22 天 ✅ - **huawei**: - 6.5~6.26,6.9~6.15(包含),6.17~6.21(也在范围内) - 整体就是 6.5~6.26 → 22 天 ✅ --- ## ✅ 回答总结: - `maxEdt` 出现 `NULL` 是因为第一行前面没有数据,符合窗口定义。 - `maxEdt` 显示比当前 `edt` 大,是因为它反映的是**之前活动中最晚结束时间**,而非当前行。 - 要准确统计去重天数,必须先**合并重叠/连续的时间区间**,不能简单相加。 - 上述 SQL 完整实现了“按品牌合并打折时间段并计算总天数”的需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值