我有一個表Student
在SQL Server中使用這些列:SQL查詢發現最常水平出現
[ID], [Age], [Level]
我想返回出現在Students
每個年齡值的查詢,以及網絡連接NDS出現的電平值最經常。例如,如果有更多的'a'
年滿18歲的學生,比「b」或「c」應該打印這對(18, a)
。
我是SQL Server的新手,我想用嵌套查詢的簡單答案。
我有一個表Student
在SQL Server中使用這些列:SQL查詢發現最常水平出現
[ID], [Age], [Level]
我想返回出現在Students
每個年齡值的查詢,以及網絡連接NDS出現的電平值最經常。例如,如果有更多的'a'
年滿18歲的學生,比「b」或「c」應該打印這對(18, a)
。
我是SQL Server的新手,我想用嵌套查詢的簡單答案。
ORDER BY子句中的ROW_NUMBER排序函數還有一個選項。 WITH TIES用於當您想要返回兩個或更多行,並且與限定結果集中最後一個地方相匹配的行。
SELECT TOP 1 WITH TIES age, level
FROM dbo.Student
GROUP BY age, level
ORDER BY ROW_NUMBER() OVER(PARTITION BY age ORDER BY COUNT(*) DESC)
或使用量每對年齡和水平,計數對年齡的最大值和每個年齡層次的查詢的第二個版本。
SELECT *
FROM (
SELECT age, level, COUNT(*) AS cnt,
MAX(COUNT(*)) OVER(PARTITION BY age) AS mCnt
FROM dbo.Student
GROUP BY age, level
)x
WHERE x.cnt = x.mCnt
演示上SQLFiddle
@alexanderFedorako:可以在沒有使用row_number()的情況下寫入數據,並通過命令進行分區嗎?因爲我不知道這些如何工作.. – parisa
爲此,您可以使用窗口函數:
select t.*
from (select age, level, count(*) as cnt,
row_number() over (partition by age order by count(*) desc) as seqnum
from student s
group by age, level
) t
where seqnum = 1;
內部查詢彙總數據來計算每個年齡層次的數量。 row_number()
列舉了每個年齡的這些(最大的第一個partition by
)。 where
子句然後選擇最高值。
在關係的情況下,這隻返回其中的一個值。如果你想要所有這些,請使用rank()
而不是row_number()
。
我想你的意思是你的別名子查詢作爲T,不秒。 – Brandon
with combinations as (
select age, level, count(*) occurrences
from Student
group by age, level
)
select age, level
from combinations c
where occurrences = (select max(occurrences)
from combinations
where age = c.age)
這會找到Students表中的每個年齡和級別組合,並計算每個級別的出現次數。 然後,對於每個年齡/級別組合,找到那個年齡/級別組合出現次數最多的那個組合。返回該行的年齡和級別。
這具有不受限於SQL Server的優勢 - 它是純粹的SQL。但是,Gordon指出的一個窗口函數可能在SQL Server上表現更好。
謝謝@AlexanderFedorenko - 很好的電話。我需要使用的是CTE,因此我可以兩次引用同一個對象。 – Brandon
另一種選擇,但需要更高版本的SQL-Server的版本:
;WITH x AS
(
SELECT age,
level,
occurrences = COUNT(*)
FROM Student
GROUP BY age,
level
)
SELECT *
FROM x x
WHERE EXISTS (
SELECT *
FROM x y
WHERE x.occurrences > y.occurrences
)
我知道這並不完全回答這個問題,因爲它只有返回歲/年齡層次不止一個級別的組合。
也許有人可以幫忙修改它,所以它包括單級年齡在結果集中藏漢:http://sqlfiddle.com/#!3/d597b/9
+1很好的結構和明確的問題 – whytheq