Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql (今天计算)减去(前一天计算),持续1个月_Mysql_Sql - Fatal编程技术网

Mysql (今天计算)减去(前一天计算),持续1个月

Mysql (今天计算)减去(前一天计算),持续1个月,mysql,sql,Mysql,Sql,如何查询需要与前一天计数之和相减的今天计数之和,持续时间为一个月 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%'; 我有两个表和列,如下

如何查询需要与前一天计数之和相减的今天计数之和,持续时间为一个月

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%';
我有两个表和列,如下所示:

表格成员\u档案

memberProfileNumber
id
表成员\u令牌

memberProfileId
createdAt
预期结果:


如果您使用的是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:我认为
左连接成员令牌
应该是
内部连接成员令牌
,因为列
成员令牌.createdAt
用于聚合结果


NB2:子查询对上个月内创建的令牌进行筛选。

如果您使用的是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:我认为
左连接成员令牌
应该是
内部连接成员令牌
,因为列
成员令牌.createdAt
用于聚合结果


NB2:子查询对上个月内创建的令牌进行筛选。

您可以通过简单的联接来完成此操作

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表的相关性。

您可以通过一个简单的连接来实现这一点

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表的相关性。

如果您将示例数据和预期输出作为文本添加到问题中,您将得到更快的答案(可能更合适)。如果您在问题中添加示例数据和预期输出作为文本,您将得到更快的答案(可能更合适)。否则我将不得不补足。member profile表将使用条件来计算满足条件的memberprofilenumber。我将测试这个查询。谢谢:)member profile表将使用条件来计算满足条件的memberprofilenumber。我将测试这个查询。谢谢:)