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。我将测试这个查询。谢谢:)