首页 > 其他 > 详细

group by range

时间:2018-02-09 14:33:30      阅读:187      评论:0      收藏:0      [点我收藏+]
  • 建立测试表
  • testdb=# CREATE TEMP TABLE team (
    id serial,
    name text,
    birth_year integer,
    salary integer
    );

    1. 插入记录

    testdb=# INSERT INTO team (name, birth_year, salary)
    VALUES (‘Gabriel‘, 1970, 44000),
    (‘Tom‘, 1972, 36000),
    (‘Bill‘, 1978, 39500),
    (‘Bob‘, 1980, 29000),
    (‘Roger‘, 1976, 26800),
    (‘Lucas‘, 1965, 56900),
    (‘Jerome‘, 1984, 33500),
    (‘Andrew‘, 1992, 41600),
    (‘John‘, 1991, 40000),
    (‘Paul‘, 1964, 39400),
    (‘Richard‘, 1986, 23000),
    (‘Joseph‘, 1988, 87000),
    (‘Jason‘, 1990, 55000);

    1. 查询结果

    testdb=# WITH series AS (
    SELECT generate_series(1950, 2000, 10) AS time_start -- 1950 = min, 2010 = max, 10 = 10 year interval
    ), range AS (
    SELECT time_start, (time_start + 9) AS time_end FROM series -- 9 = interval (10 years) minus 1
    )
    SELECT time_start, time_end,
    (SELECT count(*) FROM team WHERE birth_year BETWEEN time_start AND time_end) as team_members,
    round((SELECT AVG(salary) FROM team WHERE birth_year BETWEEN time_start AND time_end), 2) as salary_avg,
    (SELECT MIN(salary) FROM team WHERE birth_year BETWEEN time_start AND time_end) as salary_min,
    (SELECT MAX(salary) FROM team WHERE birth_year BETWEEN time_start AND time_end) as salary_max
    FROM range;

    输出结果:

    time_start | time_end | team_members | salary_avg | salary_min | salary_max
    ------------+----------+--------------+------------+------------+------------
    1950 | 1959 | 0 | | |
    1960 | 1969 | 2 | 48150.00 | 39400 | 56900
    1970 | 1979 | 4 | 36575.00 | 26800 | 44000
    1980 | 1989 | 4 | 43125.00 | 23000 | 87000
    1990 | 1999 | 3 | 45533.33 | 40000 | 55000
    2000 | 2009 | 0 | | |
    (6 rows)

    testdb=#

    group by range

    原文:http://blog.51cto.com/heyiyi/2070561

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
    © 2014 bubuko.com 版权所有
    打开技术之扣,分享程序人生!