【问题标题】:Write Query to display look like in image编写查询以显示图像中的样子
【发布时间】:2021-02-12 21:57:49
【问题描述】:

提供的表格显示了在特定日期注册的所有新用户,格式为YYYY-MM-DD

您的查询应该输出从一个月到下一个月的变化。因为第一个月没有前一个月,所以您的输出应该跳过该行。您的输出应如下表所示。

我的表格数据

表格数据:

ID    DateJoined
1     2017-01-06
2     2017-01-12
3     2017-01-16
4     2017-01-25
5     2017-02-05
6     2017-02-07
7     2017-02-21
8     2017-03-05
9     2017-03-07
10    2017-03-14
11    2017-03-16
12    2017-03-25
13    2017-03-25
14    2017-03-25
15    2017-03-25
16    2017-03-26
17    2017-04-05
18    2017-04-14
19    2017-04-21
20    2017-05-07
23    2017-05-14
24    2017-05-16
25    2017-05-25
26    2017-05-25
27    2017-05-25
28    2017-05-25

Enter image description here

我想要这个输出: 统计每个月的所有记录,然后从下个月的记录中减去。

这是我的查询:

SELECT
   MONTH(L.joindate),
   COUNT(L.joindate) -  COUNT(R.joindate),
   MONTH(R.joindate),
   COUNT(R.joindate)
FROM
   userlog       AS L
LEFT JOIN
   userlog       AS R
      ON MONTH(R.joindate)= (SELECT MIN(MONTH(joindate)) FROM userlog WHERE MONTH(joindate) < MONTH(L.joindate))
GROUP BY (MONTH(L.joindate)),(MONTH(R.joindate));

【问题讨论】:

标签: mysql sql count subquery aggregate-functions


【解决方案1】:

使用lag(),在 MySQL 8.0 中可用:

select date_format(joindate, '%Y-%m-01') joinmonth,
    count(*) - lag(count(*), 1, 0) over(order by date_format(joindate, '%Y-%m-01')) m2m
from userlog
group by joinmonth

请注意,我将逻辑更改为将日期截断为第一个月以使用date_format()

在早期版本中,您可以使用关联子查询:

select date_format(joindate, '%Y-%m-01') joinmonth,
    count(*) - (
        select count(*)
        from userlog l1
        where l1.joindate >= date_format(l.joindate, '%Y-%m-01') - interval 1 month
          and l1.joindate <  date_format(l.joindate, '%Y-%m-01')
    ) m2m
from userlog l
group by joinmonth
LIMIT 12 OFFSET 1

【讨论】:

  • @MistryJignesh:查询有什么问题?
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2016-05-25
  • 2013-03-25
  • 1970-01-01
  • 2019-08-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多