要实现连续 30 天的相关统计的方法

2021-12-16 10:58:54 +08:00
 onhao

如题:

1.在程序里,请求 30 天的数据
2.在数据库里直接调取 30 天的数据。

看楼主的实现方法

2899 次点击
所在节点    程序员
20 条回复
xuanbg
2021-12-16 11:07:19 +08:00
行转列,case .... then ... when ... end as day1, case .... then ... when ... end as day2, ...
hushulin
2021-12-16 11:15:59 +08:00
使用 mysql8 的窗口函数应该也能实现你的需求吧
dqzcwxb
2021-12-16 11:17:07 +08:00
内存够,查 30 次(每天)的数据一天天做比对
内存不够,初始化查两天的数据,比对出连续签到的数据再查下一天数据继续比对,如果内存还是不够可以改成分页

优化点:多线程并行查询,多线程并行比对,转 map 比对,利用 redis(zset 是跳表)存储数据和比对

用数据库解决只会带来无穷无尽的麻烦
neptuno
2021-12-16 11:26:35 +08:00
这种统计还是每天跑数据去分析吧,记录每家店每天的分析数据
PerFectTime
2021-12-16 11:56:06 +08:00
1.写个表值函数,获取指定范围内日期的格式化字符串 yyyy-MM-dd
2.按天分组汇总结果,结果表 JOIN 表值函数,处理后得出报表
onhao
2021-12-16 12:37:58 +08:00
@xuanbg 貌似不行?可能是 需求的问题。

@hushulin 可以贴下代码不,借鉴下。

@dqzcwxb 数据库查基础数据,再在程序里做对应的运算

@neptuno 也不失为一个办法。

@PerFectTime 表值函数是自定义还是系统自带的?-可以贴下代码不,
Saxton
2021-12-16 12:48:39 +08:00
这个需求我做过,我是用 SQL+代码逻辑算出来的 没用统计表
2i2Re2PLMaDnghL
2021-12-16 13:09:57 +08:00
题目描述不清

问:已知数据库存稀疏表其中 0 值不存,在何处填充 0
1. 在业务逻辑中填充
2. 在 SQL 语句中填充

答:两种差得不是特别多,实际得看你的业务将其视为数据的一部分还是业务的一部分。
也就是说,当且仅当数据库原本设计为保存 0 ,之后优化数据库结构才产生的空洞,则应用 SQL 处理
否则应用业务代码处理
onhao
2021-12-16 13:31:43 +08:00
@2i2Re2PLMaDnghL 按日期分组( group by) 后 得到的值可能会存在某些日期没有数据则就没有对应日期,那么连接一张连续日期的表, 即可解决这个问题。
2i2Re2PLMaDnghL
2021-12-16 13:38:47 +08:00
@onhao SQL select 出来没有对应日期就没有对应日期,不是什么问题,后端补就是了,甚至可以前端再补。
PerFectTime
2021-12-16 13:43:15 +08:00
@onhao #9 自己写表值函数,我这个示例是按月的,可以自己改改。献丑了

https://gist.github.com/IcedMango/35f40e36b674bf3c27212d004d20f871


SELECT *
FROM dbo.getRangeMonthList('2020-01-01', '2021-12-01');
结果如下图
onhao
2021-12-16 13:59:37 +08:00
@2i2Re2PLMaDnghL #10 能数据库解决,且并不花销很大资源,能不麻烦前后端皆大欢喜^_^

@Saxton 看来我们是一样的啊

@PerFectTime 一直想实现你这个自定义函数,对就是这个味!
Saxton
2021-12-16 15:25:51 +08:00
@onhao 我是数据库查 然后代码补全的 光靠 SQL 是超级麻烦的
yohole
2021-12-16 15:38:50 +08:00
这个需求在我工作一两年的时候做过类似,当时写了至今认为最难维护,性能最差的 SQL (手动狗头)
2i2Re2PLMaDnghL
2021-12-16 15:40:14 +08:00
@onhao 恰当的、一致的职责划分是可维护性的必要条件
pengtdyd
2021-12-16 15:40:59 +08:00
上大数据
onhao
2021-12-16 16:42:38 +08:00
@yohole 可以分享下过程不 (手动狗头)

@2i2Re2PLMaDnghL #15 我竟然无力反驳(手动狗头)

@pengtdyd 30 天的数据应该还上不到 大数据 (手动狗头)
leeg810312
2021-12-16 19:08:59 +08:00
这么多年的开发经验就是这种需求做离线统计,一般是每天凌晨做一次,第二天可查。至于实现方式没有什么最佳实践,可以存储过程,也可以用程序跑,反正都是凌晨低峰时间
Valid
2021-12-16 20:35:51 +08:00
每天记录,不然的话以后很痛苦
onhao
2021-12-16 22:16:19 +08:00
@Valid 是的,每天都记录。
具体的需求:一个链接 当天进来的用户 在未来 30 天的充值情况,然后每天都会进来新的用户,一天天的算未来 30 天的充值情况。


@leeg810312 是的我们好多定时任务都是在低峰执行,不过这个需求,都是直接从充值表调数据。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX