V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onhao
V2EX  ›  程序员

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

  •  
  •   onhao · 2021-12-16 10:58:54 +08:00 · 2874 次点击
    这是一个创建于 1074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题:

    eg

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

    看楼主的实现方法

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

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

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

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

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

    @neptuno 也不失为一个办法。

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

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

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

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


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

    @Saxton 看来我们是一样的啊

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

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

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


    @leeg810312 是的我们好多定时任务都是在低峰执行,不过这个需求,都是直接从充值表调数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2687 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 03:10 · PVG 11:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.