我有一張表列出了每個班級學生的成績。 我想要的結果集看起來像:SQL Server模式SQL
BIO...B
CHEM...C
其中「B」和「C」是該類的模式。 我可以得到所有等級的方式,但不知道如何讓每類模式
我有一張表列出了每個班級學生的成績。 我想要的結果集看起來像:SQL Server模式SQL
BIO...B
CHEM...C
其中「B」和「C」是該類的模式。 我可以得到所有等級的方式,但不知道如何讓每類模式
這裏,像這樣的SQL 2005/2008:
;WITH
Counts AS (
SELECT ClassName, Grade, COUNT(*) AS GradeFreq
FROM Scores
GROUP BY ClassName, Grade
)
, Ranked AS (
SELECT ClassName, Grade, GradeFreq
, Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY GradeFreq DESC)
FROM Counts
)
SELECT * FROM Ranked WHERE Ranking = 1
或者只是:
;WITH Ranked AS (
SELECT
ClassName, Grade
, GradeFreq = COUNT(*)
, Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC)
FROM Scores
GROUP BY ClassName, Grade
)
SELECT * FROM Ranked WHERE Ranking = 1
謝謝,這將做到這一點,但我正在研究如何做一個UDF – bmw0128 2010-01-11 22:36:09
,如果您想要的模式,一個解決方案是在這裏:
http://oreilly.com/catalog/transqlcook/chapter/ch08.html
"Calculating a Mode"
,如果你想在中間,看看在SQL Server此解決方案:
http://oreilly.com/catalog/transqlcook/chapter/ch08.html
scroll to "Calculating a Median"
其他解決方案獲得中位數:
http://www.sqlmag.com/Files/09/49872/Listing_05.txt
http://www.tek-tips.com/faqs.cfm?fid=4751
使用GROUP BY子句。
SELECT className, ClassMode(className)
FROM Grades
GROUP BY className
你的模式()函數將不得不當然被創建,但它會像一個簡單的函數:
CREATE FUNCTION ClassMode(@ClassName varchar(50))
RETURNS varchar(2)
AS
BEGIN
Declare @temp varchar(2)
SELECT @temp = TOP 1 Grade, COUNT(*) Grades as frequency
FROM Grades
WHERE ClassName = @ClassName
GROUP BY ClassName
ORDER BY frequency DESC
RETURN @temp
END
功能代碼中缺少某些東西不是嗎?看起來好像@ClassName根本不用。我認爲它應該將FROM子句變爲「FROM Grades where ClassName = @ClassName」或將GROUP BY子句變爲GROUP BY ClassName HAVING ClassName = @ClassName。 另外,主要中的SELECT可以簡單地從Grades中選擇不同的ClassName,ClassMode(ClassName)。這樣您每個ClassName都有一個模式。還是我得到這個錯誤? – 2010-01-11 22:01:01
感謝您對函數定義的理解 - 絕對錯過了where/having。至於截然不同的情況,你可以肯定做到這一點 - 我在OP的印象中會給每個學生做這件事,所以我懷疑這個簡單的查詢會完成他們需要的東西,但是對於給定的例子你是正確的。 – womp 2010-01-11 22:30:11
我需要每班的模式,所以你說我需要修改這個UDF使它工作? – bmw0128 2010-01-11 22:44:07
這不是模式,如果你是在統計意義上說話。模式是最常出現的元素。在這種情況下,你的兩個類都是雙模態的(A,C代表Bio和B,D代表Chem) – 2010-01-11 21:29:33
我使用的結果集與我使用的示例表值無關 – bmw0128 2010-01-11 21:35:03
那麼你真的想要模式嗎?或者,您是否在尋找您的示例顯示的平均值或中值(難以用兩個值來判斷)? – 2010-01-11 21:38:08