2013-06-01 28 views
2

我有一個表Student在SQL Server中使用這些列:SQL查詢發現最常水平出現

[ID], [Age], [Level] 

我想返回出現在Students每個年齡值的查詢,以及網絡連接NDS出現的電平值最經常。例如,如果有更多的'a'年滿18歲的學生,比「b」或「c」應該打印這對(18, a)

我是SQL Server的新手,我想用嵌套查詢的簡單答案。

+0

+1很好的結構和明確的問題 – whytheq

回答

1

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

+0

@alexanderFedorako:可以在沒有使用row_number()的情況下寫入數據,並通過命令進行分區嗎?因爲我不知道這些如何工作.. – parisa

5

爲此,您可以使用窗口函數:

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()

+0

我想你的意思是你的別名子查詢作爲T,不秒。 – Brandon

1
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上表現更好。

+0

謝謝@AlexanderFedorenko - 很好的電話。我需要使用的是CTE,因此我可以兩次引用同一個對象。 – Brandon

1

另一種選擇,但需要更高版本的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