【问题标题】:MySql: query to add and categorize distinct data based on dateMySql:查询以根据日期添加和分类不同的数据
【发布时间】:2015-02-07 00:44:12
【问题描述】:

我正在尝试提取每个唯一用户每月发布的“帖子”总数,并将其分类为 2-3 个帖子和 4 个以上帖子。请看下面的例子。无法正常工作,请帮忙。

示例数据库:

id         Date                    ID             Posts     otherData
-----      ------                  -------        ------    -----------
1          2015-01-24 14:13:50     user1           1        2
2          2015-01-24 14:13:50     user1           3        1
3          2015-01-24 14:13:50     user2           2        4
4          2015-01-24 14:13:50     user3           7        3
5          2015-01-24 14:13:50     user4           0        2
6          2015-02-24 04:13:50     user1           1        3
7          2015-02-24 04:13:50     user1           1        1
8          2015-02-24 04:13:50     user3           1        2

预期结果:

Month     totalUsersThatHavePosted    1 post     2-3Posts          4+Posts
-----     -------------------------   ------     ---------         ------- 
12015     3                           0          1                 2
22015     2                           1          1                 0

我正在尝试这样的查询(但不要认为我很接近):

SELECT CONCAT( MONTH(  `Date` ) , YEAR(  `Date` ) ) AS Month, COUNT(DISTINCT `ID`) 
FROM  `myDB` 
WHERE  `Posts` >0
GROUP BY CONCAT( MONTH(  `Date` ) , YEAR(  `Date` ) ) 

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我相信这会给你想要的:

    SELECT 
    Month,COUNT(DISTINCT(user_total)) AS totalUsersThatHavePosted,
    SUM((user_total) = 1) as 1_post,
    SUM((user_total) in (2, 3)) as 2_3_posts, 
    SUM((user_total) > (3)) as 4_plus_posts 
    FROM 
    (
        SELECT CONCAT(MONTH(Date),
        YEAR(Date)) AS Month,
        ID,
        SUM(Posts) AS user_total 
        FROM myDB 
        WHERE Posts > 0
        GROUP BY Date,ID
    ) 
    AS desired_subset 
    
    GROUP BY Month;
    

    【讨论】:

      【解决方案2】:

      这是一个双重聚合查询。首先,按用户和月份聚合,得到计数。然后按月汇总以进行最终计数:

      select yr, mon, count(*) as TotalUsersPosted,
             sum(cnt in (2, 3)) as posts_2_3,
             sum(cnt >= 4) as posts_4pl 
      from (select id, year(date) as yr, month(date) as mon, count(*) as cnt
            from mydb
            group by id, year(date), month(date)
           ) t
      group by yr, mon
      

      【讨论】:

      • 抱歉,我进行了编辑,请参阅示例数据库的第 5 行。如何不包括尚未发布的用户。
      • 您可以将where 子句添加到子查询中。
      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多