【问题标题】:(Count on today) minus (count on previous day) for 1 Month duration(今天计算)减去(前一天计算)持续 1 个月
【发布时间】:2019-04-01 08:21:57
【问题描述】:

如何查询今天的总和需要减去前一天的总和,持续一个月的每天。

SELECT COUNT(DISTINCT member_profile.memberProfileNumber)
FROM member_profile
LEFT JOIN member_token
ON member_profile.id = member_token.memberProfileId
WHERE member_profile.memberProfileNumber LIKE 'MM%';

我有两个表格和列如下:

表成员个人资料

memberProfileNumber
id

表成员令牌

memberProfileId
createdAt

预期结果:

【问题讨论】:

  • 如果您将示例数据和预期输出作为文本添加到问题中,您将获得更快的答案(并且可能更合适)。否则我就得补上。

标签: mysql sql


【解决方案1】:

如果您使用的是 MySQL 8.0,您可以在子查询中进行聚合,然后在外部查询中使用 LAG(...) OVER(...) 将前一天的值带入,例如:

SELECT 
    createdAtDay,
    cnt,
    cnt - LAG(cnt) OVER(ORDER BY createdAtDay) cnt_diff
FROM (
    SELECT DATE(mt.createdAt) createdAtDay, COUNT(DISTINCT mf.memberProfileNumber) cnt
    FROM member_profile mf
    INNER JOIN member_token mt 
        ON mf.id = mt.memberProfileId 
        AND mt.createdAt >= NOW() - INTERVAL 1 MONTH
    WHERE mf.memberProfileNumber LIKE 'MM%' AND 
    GROUP BY DATE(createdAt)
) x

NB1:我认为LEFT JOIN member_token 应该是INNER JOIN member_token,因为member_token.createdAt 列用于汇总结果。

NB2:子查询过滤上个月内创建的令牌。

【讨论】:

    【解决方案2】:

    您可以通过简单的加入来做到这一点

    drop table if exists member_profile,member_token;
    create table member_profile
    (memberProfileNumber int, id int);
    
    create Table member_token
    (memberProfileId  int,createdAt date);
    
    insert into member_profile values
    (1,1),(2,2),(3,3);
    insert into member_token values
    (1,'2019-01-01'),(1,'2019-01-01'),
    (2,'2019-01-01'),(3,'2019-01-01'),
    (1,'2019-01-02'),(2,'2019-01-02'),
    (1,'2019-01-03'),(3,'2019-01-03');
    
    select mt.createdat,count(distinct memberprofileid) todayobs,
            y.createdat yesterdaydate,
             max(yesterdayobs) yesterdayobs,
             ifnull(count(distinct memberprofileid),0) -  ifnull(max(yesterdayobs),0) changeonday
    from member_token mt
    left join
    (select createdat,count(distinct memberprofileid) yesterdayobs
        from member_token mt1 
             group by createdat
             ) y on y.createdat = date_sub(mt.createdat, interval 1 day)
    group by mt.createdat;
    
    +------------+----------+---------------+--------------+-------------+
    | createdat  | todayobs | yesterdaydate | yesterdayobs | changeonday |
    +------------+----------+---------------+--------------+-------------+
    | 2019-01-01 |        3 | NULL          |         NULL |           3 |
    | 2019-01-02 |        2 | 2019-01-01    |            3 |          -1 |
    | 2019-01-03 |        2 | 2019-01-02    |            2 |           0 |
    +------------+----------+---------------+--------------+-------------+
    3 rows in set (0.00 sec)
    

    注意 1) 我没有限定月份 2) 解决方案假设 member_token 表中每天都有一个条目 3) 我没有看到 member_profile 表的相关性。

    【讨论】:

    • 会员档案表是使用条件来统计满足条件的会员档案数。我将测试这个查询。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多