Как эффективно подсчитывать значения столбца в 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*