2014-09-19 82 views
2

您好我是sql新手,並且遇到問題。Sql在每個分類中獲得前2名的結果

下面是我的表的示例。這不是確切的表格,而是我試圖實現的示例

Name Classification Hits 
    A  A1    2 
    A  A2    3 
    A  A3    4 
    A  A4    8 
    A  A5    9 
    B  B1    9 
    B  B2    3 
    B  B3    4 
    B  B4    8 
    B  B5    9 
    c  c1    8 
    c  c2    9 
    c  c3    4 
    c  c4    8 
    c  c5    9 
    ... 

而且我正在尋找基於頂級Hits的結果。例如

Name Classification Hits 
A  A4    8 
A  A5    9 
B  B1    9 
B  B5    9 
c  c2    9 
c  c5    9 

我已經嘗試此查詢

SELECT TOP (2) Name , Classification , Hits 
FROM Table4 
Group By Name , Classification , Hits 
Order By Hits 

但我只獲得兩個值。我在這裏做錯了什麼建議?

+0

您正在使用Top(2)這就是爲什麼只有兩條記錄來臨 – 2014-09-19 05:57:55

+0

我以爲相同的@SyedSalmanRazaZaidi。但我應該怎麼做才能得到我的結果> – Coder 2014-09-19 06:00:25

回答

2

您可以使用與Row_Number()功能的CTE

;WITH CTE AS(
    SELECT Name, 
     Classification, 
     Hits, 
     Row_Number() OVER(Partition by name ORDER BY Hits DESC) AS RowNum 
    FROM Table4 
) 

SELECT Name, 
     Classification, 
     Hits 
FROM CTE 
WHERE RowNum <= 2 
ORDER BY Name, Hits 

SQL FIDDLE DEMO

+0

好的工作,我已經提出瞭解決方案,但不會發布作爲答案是相同的使用CTE ... – Murtaza 2014-09-19 06:09:30

0

我從內存工作,所以我不知道語法的,並且有可能是這樣做更有效的方式,但你想要做這樣的事情

;with rawdata as (
    select Name, Classification, Hits, 
      Row_number() over (partition by Name order by Hits desc) as x 
) 
select Name, Classification, Hits from rawdata where x < 3 
+0

感謝您的編輯 - 我會找出評論系統這些日子之一! – 2014-09-20 02:32:47

0

這也將正常工作。不使用ROW_NUMBER()。

Select a.* from MyTable as M1 
Cross apply 
(
    Select top 2 * from Mytable m2 
    where m1.name = m2.name 
    order by m2.Hits desc 
)as a 
where a.Classification = m1.Classification 

Fiddle Demo

但我不知道性能。

+0

我正在使用SQL服務器並獲取錯誤交叉應用不支持 – Coder 2014-09-19 06:20:33

+0

我希望你使用SQL Server 2008.正確嗎? – AK47 2014-09-19 06:21:29

+0

是........... – Coder 2014-09-19 06:22:05