【问题标题】:Is that possible to group result on 3 months period basis?是否可以按 3 个月的周期对结果进行分组?
【发布时间】:2013-12-11 07:59:30
【问题描述】:

我正在尝试按从当前月份开始的 3 个月期间对结果进行分组,如下所示:

row1      15 -- This should contain November, September and October
row2      25 -- This should contain August, July and June
row3      5  -- This should contain May, April and March
row4      2  -- This is should contain February and Janvier

我不知道如何做到这一点。请问有什么帮助吗?

到目前为止,我可以按月分组:

SELECT MONTH(date), MONTHNAME(date) as month, COUNT(*) FROM table_name WHERE MONTH(date) < NOW()  GROUP BY MONTH(date) ORDER BY MONTH(date) DESC

谢谢

【问题讨论】:

  • 听起来您需要通过每个特定月份的脚本语言检查日期
  • 看起来三个月这个词正在造成混乱,所以我刚刚更新了我的问题。谢谢
  • 我会尝试使用一个简单的 CASE 来为月份赋值,例如 f.e. 1 表示 11 月、9 月或 10 月,2 表示 6 月、7 月或 8 月等 - 然后按该值分组。
  • 甚至不必是很长的 CASE 语句,可以使用单个 ELT 来“分配”给定月份的适当分组值……

标签: mysql sql date


【解决方案1】:

您可以使用PERIOD_DIFF 和一些数学来查找记录。

-- This line creates YYYYMM representation of today; you can use PHP instead
SET @T1 = DATE_FORMAT(CURRENT_DATE, '%Y%m');

SELECT MIN(`date`) AS `Range Start`, MAX(`date`) AS `Range End`, COUNT(*) AS `Count`
FROM `table`
GROUP BY FLOOR(PERIOD_DIFF(@T1, DATE_FORMAT(`date`, '%Y%m')) / 3)
ORDER BY 1 DESC

样本输出:

Range Start  Range End   Count
-----------  ----------  -----
2013-09-01   2013-11-26  87
2013-06-01   2013-08-31  92
2013-03-01   2013-05-31  92
2012-12-01   2013-02-28  90
2012-09-01   2012-11-30  91

PERIOD_DIFF 返回周期 P1 和 P2 之间的月数(两个参数都是 YYYYMM 格式的字符串)。

在上述查询中,我们计算每一行的月差(例如 NOV-2013 为 0,OCT-2013 为 1,SEP-2013 为 2,AUG-2013 为 3 等等)。

差除以 3 加上 FLOOR 得出季度数(NOV-2013 是 0.00 -> 0,OCT-2013 是 0.33 -> 0,SEP-2013 是 0.66 -> 0,AUG-2013 是 1.00 - > 1,以此类推)。

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作......

    SELECT FLOOR((MONTH(date))/3)+1 quarter
         , COUNT(*) total FROM my_dates 
     GROUP 
        BY FLOOR((MONTH(date))/3);
    

    【讨论】:

    • 它没有。您应该在 group by 中使用 CEIL 而不是 FLOOR,否则您将在 12 月得到一个超级怪异的“第五季度”。此外,您可能还应该按年份分组
    • @ma1069 去拿考古徽章?
    【解决方案3】:

    @Strawberry 解决方案后更新查询。

    SELECT
      CONCAT(DATE_FORMAT(tradeDate, '%Y'), '-quarter-', CEIL((MONTH(date))/3)) quarter,
      COUNT(*) total FROM my_dates
    GROUP BY
      CONCAT(DATE_FORMAT(tradeDate, '%Y'), '-quarter-', CEIL((MONTH(date))/3));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多