mysql - 按 "every 30 days"对 mysql 结果进行分组

标签 mysql group-by

我有一个问题:

SELECT 
  COUNT(id) as amount,
  DATEDIFF(expire, buydate) as days
FROM `vw8mv_orders`
GROUP BY MONTH(expire)

结果是:

    amount  days
    1       22
    1       30
    1       105
    1       161

我想在一个组中(每 30 天)查看这些结果。如果天数在1到30天之间,则将其放入30天组,如果投注31-60,则放入60天组,依此类推。

例如:

    amount  time
      2     30 days
      0     60 days
      1     90 days

最佳答案

您需要创建一个计算列作为分组依据。您可以使用多种方法进行计算,但一个不错的选择可能是使用 DIV operator 进行整数除法。 :

SELECT
    COUNT(id) as amount,
    (((datediff(expire, buydate) DIV 30) + 1) * 30) as timegroup
FROM
    table
GROUP BY timegroup;

我喜欢这种方法的原因,而不是使用例如 some fancy arithmetic with ROUND() ,是不是更清楚您要做什么。 datediff(expire, buydate) DIV 30 说,取这些日期的差值,然后告诉我该数字中“有多少个 30”。

这就是您分组所需的全部内容;剩下的就是让列以您想要的方式显示,如 30, 60, 90, ... 而不是 0, 1, 2, ....

如果您对整数除法不满意,另一种选择是 CEILING function :

SELECT
    COUNT(id) as amount,
    30 * CEILING(datediff(expire, buydate) / 30) as timegroup
FROM
    table
GROUP BY timegroup;

从数学上讲,CEILING(x/N) 等同于((x DIV N) + 1),但它与CEILING 的关系不大()

关于mysql - 按 "every 30 days"对 mysql 结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23545695/

相关文章:

mysql - 如何对简单调查的结果进行建模?

mysql - 插入查询不起作用!这些值没有反射(reflect)在表格中

MySQL - 使用 SET 语句更新查询取决于前一个 SET 语句的结果

mysql - 在这种情况下如何减少一个 SQL 查询

mysql - mysql中按年、月分组时出错

postgresql - 如何在 group by 子句后应用 case when 语句

mysql - 如何选择所有学生选修的所有科目,使所有学生的成绩都> 50

尝试使用 CASE 更新时 MySQL 错误 1064

mysql - 如何根据多个排序列选择每组的第一行?

mysql - SQL 从具有该值的不同 id 的列中选择值