4

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

我可以编写多个查询来做到这一点,但这意味着我必须为每个范围编写不同的查询。有没有办法从最少的年份(10 年的间隔)动态递增并计算间隔内的记录数?

4

3 回答 3

5

首先计算每一行的十年

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
于 2012-12-08T17:50:13.793 回答
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将给出1990CEIL(1992 / 10)=200和 times 10=的2000相同之处,减号11999所以year应该是1990-1999

于 2012-12-08T17:17:35.677 回答
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;
于 2012-12-08T18:18:40.743 回答