簡體   English   中英

"如何在 SQL 中有效地計算列值的出現次數?"

[英]How to count occurrences of a column value efficiently in SQL?

我有一張學生表:

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

我想查詢所有學生,以及一個計算有多少學生同齡的附加列:

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

這樣做最有效的方法是什么? 我擔心子查詢會很慢,我想知道是否有更好的方法 在那兒?

這應該工作:

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

如果您還需要id,則可以將上面的內容包含在子查詢中,如下所示:

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

如果您使用的是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

這是另一種解決方案。 這個使用非常簡單的語法。 接受的解決方案的第一個示例不適用於舊版本的Microsoft SQL(即2000)

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

我會做的事情如下:

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

如果“年齡”欄中的數據具有相似的記錄(即許多人年齡為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*

這應該有效:

您可以獲取表格的所有行並計數。

從學生中選擇 *,count(*) over();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM