2

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

 2 years ago
source link: https://www.v2ex.com/t/822549
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

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

  onhao · 1 天前 · 1574 次点击

eg

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

看楼主的实现方法

20 条回复    2021-12-16 22:16:19 +08:00

xuanbg

xuanbg      1 天前

行转列,case .... then ... when ... end as day1, case .... then ... when ... end as day2, ...

hushulin

hushulin      1 天前

使用 mysql8 的窗口函数应该也能实现你的需求吧

dqzcwxb

dqzcwxb      1 天前

内存够,查 30 次(每天)的数据一天天做比对
内存不够,初始化查两天的数据,比对出连续签到的数据再查下一天数据继续比对,如果内存还是不够可以改成分页

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

用数据库解决只会带来无穷无尽的麻烦

neptuno

neptuno      1 天前 via iPhone

这种统计还是每天跑数据去分析吧,记录每家店每天的分析数据

PerFectTime

PerFectTime      1 天前

1.写个表值函数,获取指定范围内日期的格式化字符串 yyyy-MM-dd
2.按天分组汇总结果,结果表 JOIN 表值函数,处理后得出报表

onhao

onhao      1 天前

@xuanbg 貌似不行?可能是 需求的问题。

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

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

@neptuno 也不失为一个办法。

@PerFectTime 表值函数是自定义还是系统自带的?-可以贴下代码不,

Saxton

Saxton      1 天前

这个需求我做过,我是用 SQL+代码逻辑算出来的 没用统计表

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL      1 天前

题目描述不清

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

答:两种差得不是特别多,实际得看你的业务将其视为数据的一部分还是业务的一部分。
也就是说,当且仅当数据库原本设计为保存 0 ,之后优化数据库结构才产生的空洞,则应用 SQL 处理
否则应用业务代码处理

onhao

onhao      1 天前

@2i2Re2PLMaDnghL 按日期分组( group by) 后 得到的值可能会存在某些日期没有数据则就没有对应日期,那么连接一张连续日期的表, 即可解决这个问题。

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL      1 天前

@onhao SQL select 出来没有对应日期就没有对应日期,不是什么问题,后端补就是了,甚至可以前端再补。

PerFectTime

PerFectTime      1 天前   ❤️ 1

@onhao #9 自己写表值函数,我这个示例是按月的,可以自己改改。献丑了SELECT *
FROM dbo.getRangeMonthList('2020-01-01', '2021-12-01');
结果如下图

onhao

onhao      1 天前

@2i2Re2PLMaDnghL #10 能数据库解决,且并不花销很大资源,能不麻烦前后端皆大欢喜^_^

@Saxton 看来我们是一样的啊

@PerFectTime 一直想实现你这个自定义函数,对就是这个味!

Saxton

Saxton      1 天前

@onhao 我是数据库查 然后代码补全的 光靠 SQL 是超级麻烦的

yohole

yohole      1 天前

这个需求在我工作一两年的时候做过类似,当时写了至今认为最难维护,性能最差的 SQL (手动狗头)

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL      1 天前

@onhao 恰当的、一致的职责划分是可维护性的必要条件

pengtdyd

pengtdyd      1 天前

onhao

onhao      1 天前

@yohole 可以分享下过程不 (手动狗头)

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

@pengtdyd 30 天的数据应该还上不到 大数据 (手动狗头)

leeg810312

leeg810312      22 小时 33 分钟前 via Android

这么多年的开发经验就是这种需求做离线统计,一般是每天凌晨做一次,第二天可查。至于实现方式没有什么最佳实践,可以存储过程,也可以用程序跑,反正都是凌晨低峰时间

Valid

Valid      21 小时 7 分钟前

每天记录,不然的话以后很痛苦

onhao

onhao      19 小时 26 分钟前

@Valid 是的,每天都记录。
具体的需求:一个链接 当天进来的用户 在未来 30 天的充值情况,然后每天都会进来新的用户,一天天的算未来 30 天的充值情况。


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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK