Как эффективно подсчитывать значения столбца в SQL?

У меня есть таблица студентов:

id | age
--------
0  | 25
1  | 25
2  | 23

Я хочу запросить для всех студентов и дополнительный столбец, в котором указано, сколько учеников одного возраста:

id | age | count
----------------
0  | 25  | 2
1  | 25  | 2
2  | 23  | 1

Какой самый эффективный способ сделать это? Я боюсь, что суб-запрос будет медленным, и мне интересно, есть ли лучший способ. Есть?

Ответ 1

Это должно работать:

SELECT age, count(age) 
  FROM Students 
 GROUP by age

Если вам нужен и тот же идентификатор, вы можете включить это как вспомогательный запрос, например:

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

Ответ 2

Если вы используете 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

Ответ 3

Здесь другое решение. этот использует очень простой синтаксис. Первый пример принятого решения не работал в более ранних версиях Microsoft SQL (i.e 2000)

SELECT age, count(*)
FROM Students 
GROUP by age
ORDER BY age

Ответ 4

Я бы сделал что-то вроде:

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;

Ответ 5

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

Ответ 6

и если данные в столбце "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*