我有一张学生桌:
id | age
--------
0 | 25
1 | 25
2 | 23
我想查询所有学生,并增加一列来统计有多少学生年龄相同:
id | age | count
----------------
0 | 25 | 2
1 | 25 | 2
2 | 23 | 1
最有效的方法是什么?我担心子查询会很慢,我想知道是否有更好的方法。在那儿?
我有一张学生桌:
id | age
--------
0 | 25
1 | 25
2 | 23
我想查询所有学生,并增加一列来统计有多少学生年龄相同:
id | age | count
----------------
0 | 25 | 2
1 | 25 | 2
2 | 23 | 1
最有效的方法是什么?我担心子查询会很慢,我想知道是否有更好的方法。在那儿?
Answers:
这应该工作:
SELECT age, count(age)
FROM Students
GROUP by age
如果还需要ID,则可以将上述内容作为子查询包括在内,如下所示:
SELECT S.id, S.age, C.cnt
FROM Students S
INNER JOIN (SELECT age, count(age) as cnt
FROM Students
GROUP BY age) C ON S.age = C.age
如果您使用的是Oracle,那么称为分析的功能便可以解决问题。看起来像这样:
select id, age, count(*) over (partition by age) from students;
如果您不使用Oracle,则需要重新加入计数:
select a.id, a.age, b.age_count
from students a
join (select age, count(*) as age_count
from students
group by age) b
on a.age = b.age
并且如果“年龄”列中的数据具有相似的记录(例如,许多人25岁,许多人32岁,依此类推),则在使每个学生的权利计数保持一致时会造成混乱。为了避免这种情况,我也加入了有关学生证的表格。
SELECT S.id, S.age, C.cnt
FROM Students S
INNER JOIN (SELECT id, age, count(age) as cnt FROM Students GROUP BY student,age)
C ON S.age = C.age *AND S.id = C.id*