web-dev-qa-db-fra.com

Comment compter efficacement les occurrences d'une valeur de colonne en SQL?

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?

148
Assaf Lavie

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
220
Mike Dinescu

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
25
Jeremy Bourque

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
18
Damian

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;
7
quosoo
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
4
RedFilter

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*
1
afii_palang