按每年唯一的月份分组,而不仅仅是月份[重复]

Posted

技术标签:

【中文标题】按每年唯一的月份分组,而不仅仅是月份[重复]【英文标题】:group by unique month per year, not just month [duplicate] 【发布时间】:2012-12-04 00:41:48 【问题描述】:

可能重复:mysql Query GROUP BY day / month / year

我有以下mysql:

SELECT MONTH( FROM_UNIXTIME(  `timeStamp` ) ) as month , COUNT(  `id` )  as count
FROM  `discusComments` 
GROUP BY MONTH( FROM_UNIXTIME(  `timeStamp` ) ) 
ORDER BY  MONTH( FROM_UNIXTIME(  `timeStamp` ) ) ASC 
LIMIT 15

它获取过去 15 个月内每月的条目数量。我想知道为什么它只显示过去 12 个月……然后我意识到计数是所有年份的总和,而不是每个月的唯一年份。所以 12 月的值可能是 2012 年和 2011 年的加起来。

我不想要这个。我想获得过去 15 个月以及 UNIQUE 月份年份的条目数量,例如2012 年 12 月、2012 年 11 月等。

【问题讨论】:

月回报1-12(含) 我不知道如何使它按“月年”分组,而不仅仅是“月”或“年” 【参考方案1】:

将年份添加到您的 SELECT 列列表,并将别名添加到 GROUP BY

SELECT YEAR(FROM_UNIXTIME(`timestamp`))  AS year, 
       MONTH(FROM_UNIXTIME(`timestamp`)) AS month, 
       COUNT(`id`)                       AS count 
FROM   `discuscomments` 
GROUP  BY year, 
          month 
ORDER  BY year,
          month
LIMIT  15 

【讨论】:

【参考方案2】:

对此我最直接的想法通常是将日期值的格式更改为一个唯一且能说话的字符串,例如 2012 年 12 月的 2012-12 和 2011 年 10 月的 2011-10 等。

您可以使用的函数是DATE_FORMAT()

 DATE_FORMAT(FROM_UNIXTIME(timeStamp), '%Y-%m')

这些字符串很容易排序,例如ASC:

2011-10
2011-11
2011-12
...
2012-10
2012-11
2012-12

示例 SQL 查询:

SELECT
  DATE_FORMAT(FROM_UNIXTIME(timeStamp), '%Y-%m') as month, 
  COUNT(id) as count
FROM  discusComments
GROUP BY month
ORDER BY month ASC 
LIMIT 15

【讨论】:

但这会增加复杂性,因为稍后您必须拆分 month 列。 是的,它只是某种“自己动手”/“帮助自己”的解决方案,甚至适用于低级系统。您的答案更好地采用 SQL 本身。也只是看到MySQL Query GROUP BY day / month / year【参考方案3】:

试试这个

months_between(to_date ('2009/05/15', 'yyyy/mm/dd'), 
                     to_date ('2009/04/16', 'yyyy/mm/dd'))

【讨论】:

嘿,您可能应该详细说明为什么您的解决方案会起作用

以上是关于按每年唯一的月份分组,而不仅仅是月份[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将连续的月份数添加到数据框[重复]

.NET WinForms 的月份选择器 [重复]

linux:排序,唯一与重复

如何按月份或年份计数和分组,月份为零

按月合并数据框,或与列和分组不同[重复]

将日期显示为ggplotly图的x轴中的实际日期,而不是仅显示为月份[重复]