2011-03-31 100 views
1

下面是我的表數據多列上的Sql Server Max函數?

Mat Phy Chem 
20 30 40 
25 35 35 
45 30 30 
45 40 35 

我要檢索單一行的所有三列前3位的最大行數。

O/P

Mat Phy Chem 
45 40 40 
25 35 35 
20 30 30 

我用下面的查詢,但不成功,請幫助...

Select distinct top 3 max(mat) from studata group by mat order by max(mat) desc 
Union all 
Select distinct top 3 max(phy) from studata group by phy order by max(phy) desc 
Union all 
Select distinct top 3 max(chem) from studata group by chem order by max(chem) desc 

回答

2
WITH q AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (ORDER BY mat DESC) AS rn_mat, 
       ROW_NUMBER() OVER (ORDER BY phy DESC) AS rn_phy, 
       ROW_NUMBER() OVER (ORDER BY chem DESC) AS rn_chem 
     FROM mytable 
     ) 
SELECT q_mat.mat, q_phy.phy, q_chem.chem 
FROM q q_mat 
JOIN q q_phy 
ON  q_phy.rn_phy = q_mat.rn_mat 
JOIN q q_chem 
ON  q_chem.rn_chem = q_phy.rn_phy 
WHERE q_mat.rn_mat <= 3 
+0

這肯定是矯枉過正? – 2011-03-31 14:39:35

+0

我認爲你應該使用'DENSE_RANK'而不是'ROW_NUMBER',因爲op可以爲每列有相同的值,並且它不會檢索前3個不同的最大值。 – Lamak 2011-03-31 14:40:14

+0

Quassnoi你awes​​omem它的工作原理 – Simhadri 2011-03-31 14:46:39

0

工作的呢?

select distinct top 3 Mat 
from studata 
order by Mat desc 

select distinct top 3 Phy 
from studata 
order by Phy desc 

select distinct top 3 Chem 
from studata 
order by Chem desc 

你可能會得到一個問題的原因是因爲max是函數(它僅會返回1周的事情),所以Select distinct top 3 max(mat)是無稽之談。

+0

感謝您的回覆,結果只有1行,我需要顯示前3行。 – Simhadri 2011-03-31 14:34:16

+0

查看我的更新答案,因爲您想要將行分開,您需要三個獨立的SELECT。如果你真的需要它,調查一下臨時表 – 2011-03-31 14:38:40

+0

你確實需要一個'DISTINCT',因爲這樣你可以在前3上得到相同的值,這不是你想要的 – Lamak 2011-03-31 14:41:54