J'ai une table d'étudiants:
id | age
--------
0 | 25
1 | 25
2 | 23
Je souhaite interroger tous les élèves et ajouter une colonne supplémentaire indiquant le nombre d'élèves du même âge:
id | age | count
----------------
0 | 25 | 2
1 | 25 | 2
2 | 23 | 1
Quel est le moyen le plus efficace de le faire? Je crains qu'une sous-requête ne soit lente, et je me demande s'il existe un meilleur moyen. Y a-t-il?
Cela devrait fonctionner:
SELECT age, count(age)
FROM Students
GROUP by age
Si vous avez également besoin de cet identifiant, vous pouvez l'inclure comme requête secondaire, comme ceci:
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
Si vous utilisez Oracle, une fonctionnalité appelée analytics fera l'affaire. Cela ressemble à ceci:
select id, age, count(*) over (partition by age) from students;
Si vous n'utilisez pas Oracle, vous devrez rejoindre les comptes:
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
Voici une autre solution. celui-ci utilise une syntaxe très simple. Le premier exemple de la solution acceptée ne fonctionnait pas sur les anciennes versions de Microsoft SQL (c'est-à-dire 2000)
SELECT age, count(*)
FROM Students
GROUP by age
ORDER BY age
Je ferais quelque chose comme:
select
A.id, A.age, B.count
from
students A,
(select age, count(*) as count from students group by age) B
where A.age=B.age;
select s.id, s.age, c.count
from students s
inner join (
select age, count(*) as count
from students
group by age
) c on s.age = c.age
order by id
et si les données de la colonne "âge" ont des enregistrements similaires (c’est-à-dire que beaucoup de personnes ont 25 ans, beaucoup d’autres ont 32 ans et ainsi de suite), il est difficile d’aligner le nombre exact d’élèves par élève. afin de l'éviter, j'ai également rejoint les tables sur l'identification des étudiants.
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*