首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgres SQL中,如何将值转换为范围并获得最大记录的范围

在Postgres SQL中,如何将值转换为范围并获得最大记录的范围
EN

Stack Overflow用户
提问于 2022-04-21 14:48:28
回答 2查看 169关注 0票数 1

有一个包含其姓名和年龄的学生表,如下所示,如何将年龄值转换为

  • 7-9
  • 9-11
  • 11-13
  • 13-15
  • 15-17
  • 17-19

找出最大学生的年龄范围

创建表:

代码语言:javascript
复制
CREATE TABLE students (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  age FLOAT NOT NULL
);

插入值:

代码语言:javascript
复制
INSERT INTO students
VALUES
(1, 'Ryan', 12),
(2, 'Joanna', 12.5),
(3, 'James', 11),
(4, 'Karen', 10),
(5, 'Holmes', 11.2),
(6, 'Garry', 12.1),
(7, 'Justin', 14.5),
(8, 'Emma', 15),
(9, 'Andy', 10),
(10, 'Claren', 9.5),
(11, 'Dennis', 9),
(12, 'Henna', 16),
(13, 'Iwanka', 15.4),
(14, 'June', 8.1),
(15, 'Kamila', 7.5),
(16, 'Lance', 17);

预期输出应在记录的最大计数范围内:

代码语言:javascript
复制
Range | Count 
10-12 | 5
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-21 15:04:51

您可以尝试在逻辑中使用带有CASE WHEN表达式的聚合函数,然后使用ORDER BY COUNT DESC获取记录的最大计数。

代码语言:javascript
复制
SELECT (CASE WHEN age BETWEEN 7 AND 9 THEN '7-9'
           WHEN age BETWEEN 10 AND 12 THEN '10-12'
           WHEN age BETWEEN 13 AND 15 THEN '13-15'
           WHEN age BETWEEN 15 AND 17 THEN '15-17'
           WHEN age BETWEEN 17 AND 19 THEN '17-19' END) as range,
      COUNT(*) cnt
FROM students
GROUP BY  CASE WHEN age BETWEEN 7 AND 9 THEN '7-9'
           WHEN age BETWEEN 10 AND 12 THEN '10-12'
           WHEN age BETWEEN 13 AND 15 THEN '13-15'
           WHEN age BETWEEN 15 AND 17 THEN '15-17'
           WHEN age BETWEEN 17 AND 19 THEN '17-19' END
ORDER BY COUNT(*) DESC 
LIMIT 1

编辑

如果您的范围号有一个逻辑,并且您想要一个通用的范围解决方案

您可以尝试使用generate_series使用范围逻辑生成一个范围号,然后执行外部连接。

对于您的示例数据,我将使用generate_series(7,17,2)创建一个范围号,您希望使用的是calutaion和end数

代码语言:javascript
复制
SELECT CONCAT(t1.startnum,'-',t1.endnum) as range,
      COUNT(*) cnt
FROM students s
INNER JOIN (
    SELECT v startnum,v+2 endnum
    FROM generate_series(7,17,2) v 
  ) t1 ON s.age BETWEEN t1.startnum AND t1.endnum
GROUP BY CONCAT(t1.startnum,'-',t1.endnum)
ORDER BY COUNT(*) DESC 
LIMIT 1

木琴

票数 1
EN

Stack Overflow用户

发布于 2022-04-21 15:13:25

-构造数字表。

代码语言:javascript
复制
CREATE TABLE age_range (
    id serial,
    agerange numrange
);

INSERT INTO age_range (agerange)
    VALUES ('[7,9]'), ('[10,12]'), ('[13,15]'), ('[15,17]'), ('[17,19]');

-具有窗口功能的cte

代码语言:javascript
复制
  WITH a AS (
    SELECT
        age,
        name,
        agerange
    FROM
        students s,
        age_range b
    WHERE
        age <@ agerange IS TRUE
)
SELECT
    *,
    count(agerange) OVER (PARTITION BY agerange)
FROM
    a
ORDER BY
    agerange,
    name;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71956495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档