Как эффективно посчитать вхождения значения столбца в SQL? - PullRequest
142 голосов
/ 01 октября 2009

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

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

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

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

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

Ответы [ 6 ]

213 голосов
/ 01 октября 2009

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

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
24 голосов
/ 01 октября 2009

Если вы используете 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
17 голосов
/ 10 октября 2012

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

SELECT age, count(*)
FROM Students 
GROUP by age
ORDER BY age
6 голосов
/ 01 октября 2009

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

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;
3 голосов
/ 01 октября 2009
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
0 голосов
/ 23 февраля 2017

и если данные в столбце «возраст» имеют аналогичные записи (то есть многим людям по 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*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...