按年带间隔对行进行分组

时间:2012-12-08 17:12:13

标签: mysql group-by

我有一个表(tbl_people),在这个表中我有一个日期时间字段我要分组并计算10年组记录...结果应该是这样的:
    |计数|年|
    | 1000 | 1980-1989 |
    | 250 | 1990-1999 |

我可以编写多个查询来执行此操作,但这意味着我将不得不为每个范围编写不同的查询。有没有办法从最少年份(10年间隔)动态增加并计算间隔内的记录数量?

3 个答案:

答案 0 :(得分:4)

首先计算每一行的十年

select floor(year(`year`) / 10) * 10 as decade
from tbl_people

然后使用此中间结果来计算SQL Fiddle

select count(*), decade, decade + 9
from (select floor(year(`year`) / 10) * 10 as decade
      from tbl_people) t
group by decade

或此SQL Fiddle,如果你想在一栏中找到十年

select count(*) as count, concat(decade, '-', decade + 9) as year
from (select floor(year(`year`) / 10) * 10 as decade
      from tbl_people) t
group by decade

答案 1 :(得分:0)

这应该有用 - SQL Fiddle(感谢Olaf Dietsche告诉我这个精彩的网站存在):

SELECT
    COUNT(`year`) as `count`,
    CONCAT(
        FLOOR(YEAR(`year`) / 10) * 10, 
        '-', 
        (CEIL(YEAR(`year`) / 10) * 10) - 1
    ) as `year`
FROM
    `tbl_people`
GROUP BY
    CONCAT(
        FLOOR(YEAR(`year`) / 10) * 10,
        '-', 
        (CEIL(YEAR(`year`) / 10) * 10) - 1
    )

如果数字是1992,FLOOR(1992 / 10)将提供199,而10的时间将提供1990。关于CEIL(1992 / 10) = 200和时间10 = 2000,减去1,同样的事情会给出1999,因此year应该1990-1999是{{1}}。

答案 2 :(得分:0)

这会有所帮助。

 select CONCAT(FLOOR(YEAR(from_unixtime(TIMESTAMP))/10)*10,'-',(FLOOR(YEAR(from_unixtime(TIMESTAMP))/10)*10)+9) as year , count(ID) from 
    TABLE group by FLOOR(YEAR(from_unixtime(TIMESTAMP))/10)*10;