在mysql

时间:2017-12-04 15:40:56

标签: mysql

我有一个订阅表,存储用户ID,订阅结束日期,程序ID。一个用户可以订阅许多程序,但是对于问题的范围,最新日期被视为订阅的结束日期。目标是找到每年每个月订阅结束的用户数。为了说明它:

-------------------------------------------
| user_id | program_id |  end_date        |
-------------------------------------------
|    1    |     1      |  2015-12-10      |
|    1    |     2      |  2017-08-27      |
|    2    |     1      |  2017-09-20      |
|    3    |     2      |  2017-10-01      |
|    2    |     3      |  2017-09-18      |
|    5    |     12     |  2017-10-22      |
|    4    |     3      |  2017-10-10      |
|    3    |     8      |  2018-11-15      |
-------------------------------------------

中间结果显示每个用户的订阅何时结束(仅需要一个月):

------------------------------
| user_id |   enddate        |
------------------------------
|    1    |   2017-08        |
|    2    |   2017-09        |
|    3    |   2018-11        |
|    4    |   2017-10        |
|    5    |   2017-10        |
------------------------------

这是通过查询实现的:

Select user_id, DATE_FORMAT(max(end_date), '%Y-%m') AS as enddate 
From subscription 
Group by user_id 
Order by end_date desc;

最终结果必须进一步过滤列表,仅显示每月将有多少用户没有订阅,如下所示:

------------------------------
| count   |  month, year     |
------------------------------
|    1    |   2017-08        |
|    1    |   2017-09        |
|    2    |   2017-10        |
|    1    |  2018-11         |
------------------------------

这是我没有mysql想法的地方。迭代结果并计算是不可能的。

2 个答案:

答案 0 :(得分:2)

您可以尝试按结束日期安排结果,如下所示:

    select count(user_id), DATE_FORMAT(max_end_date, '%Y-%m')as enddate 
    from (
        select user_id, max(end_date) as max_end_date
        From subscription 
        Group by user_id 
    ) n
    group by enddate
    Order by enddate desc;

答案 1 :(得分:-2)

试试这个 -

Select COUNT(*), DATE_FORMAT(MAX(end_date), '%Y-%m') AS as enddate 
From subscription 
Group by user_id 
Order by end_date desc;