首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找过去10天在mysql中出现的记录

查找过去10天在mysql中出现的记录
EN

Stack Overflow用户
提问于 2021-12-03 18:23:50
回答 1查看 33关注 0票数 2

考虑mysql表,

代码语言:javascript
复制
user_event| created_at
1          2021-12-03
2          2021-12-03
3          2021-12-03
3          2021-12-01
1          2021-11-28
2          2021-11-10
2          2021-11-01
1          2021-11-01

我正在尝试查找按created_at分组的用户数量&如果在过去10天中有一个事件,重复用户的计数

预期结果将是:

代码语言:javascript
复制
created_at | total_users | repeat_users
2021-12-03    3            2
2021-12-02    0            0
2021-12-01    1            0
.
.
2021-11-28    1            0
.
.
2021-11-10    1            1
2021-11-01    2            0

基本上,user_event 1, 2 ,3在2021~12-03有活性,所以total_users是3.2,因此在过去10天中有活性,repeat_users应该是2。同样,user_event 3在2021-12-01存在,但在最后10天没有活性,所以repeat_users是0,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-03 21:03:27

给出你的数据表

代码语言:javascript
复制
CREATE TABLE MyData
(
    user_event INT,
    created_at DATE
);

INSERT INTO MyData
VALUES
(1,'2021-12-03'),
(2,'2021-12-03'),
(3,'2021-12-03'),
(3,'2021-12-01'),
(1,'2021-11-28'),
(2,'2021-11-10'),
(2,'2021-11-01'),
(1,'2021-11-01')

您可以使用一个日历表来解决这个问题,该表可以如下所示(您可能应该在将来填充日期)

代码语言:javascript
复制
delimiter //

CREATE PROCEDURE CreateDateTable ()
BEGIN
    SET @StartDate = CAST('2021-01-01' AS DATE);
    SET @EndDate = CAST('2021-12-31' AS DATE);

    CREATE TABLE Calendar
    (
        DateValue DATE
    );

    WHILE @StartDate <= @EndDate DO
        INSERT INTO Calendar 
        (
            DateValue
        ) 
        VALUES 
        (
        @StartDate
        );
        
        SET @StartDate = DATE_ADD(@StartDate, INTERVAL 1 DAY);
    END WHILE;
END//

CALL CreateDateTable

DROP PROCEDURE CreateDateTable

一旦有了日历表,就可以选择感兴趣的日期,并使用COUNT / GROUP组合来计算当天的用户事件数,然后加入到一个子查询中,该子查询使用self join查找重复事件的数量:

代码语言:javascript
复制
SELECT  c.DateValue,
        COUNT(d.user_event) AS total_users,
        IFNULL(r.NumRepeats,0) AS repeat_users
FROM    Calendar c
        LEFT JOIN MyData d
            ON c.DateValue = d.created_at
        LEFT JOIN ( 
                        /* repeats */
                        SELECT  a.created_at,
                                COUNT(a.user_event) AS NumRepeats
                        FROM    MyData a
                                LEFT JOIN MyData b
                                    ON b.created_at > DATE_ADD(a.created_at, INTERVAL -10 DAY) AND
                                        b.created_at < a.created_at AND
                                        a.user_event = b.user_event
                        WHERE   b.user_event IS NOT NULL
                        GROUP BY a.created_at
                    ) r
            ON r.created_at = c.DateValue
WHERE   c.DateValue >= '2021-11-01' AND
        c.DateValue <= '2021-12-03'
GROUP BY c.DateValue,
        r.NumRepeats
ORDER BY c.DateValue DESC
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70219060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档