有一个包含其姓名和年龄的学生表,如下所示,如何将年龄值转换为
找出最大学生的年龄范围
创建表:
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age FLOAT NOT NULL
);插入值:
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);预期输出应在记录的最大计数范围内:
Range | Count
10-12 | 5发布于 2022-04-21 15:04:51
您可以尝试在逻辑中使用带有CASE WHEN表达式的聚合函数,然后使用ORDER BY COUNT DESC获取记录的最大计数。
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数
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发布于 2022-04-21 15:13:25
-构造数字表。
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
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;https://stackoverflow.com/questions/71956495
复制相似问题