2012-11-21 39 views
2

我知道這是Select Rows with Maximum Column Value group by Another Column的重複項,但我想選擇具有最大列值的行作爲另一列的組,但不包含嵌套選擇的聲明,我知道這是可以做到這樣的:選擇具有最大列值的行,但不包含嵌套select語句

SELECT 
    T.Name, 
    T.Rank, 
    T.ID 
FROM MyTable T 
WHERE T.Rank = (
    SELECT MAX(T1.Rank) FROM MyTable T1 
    WHERE T1.Name= T.Name 
) 

其中ID, Rank, Name是表架構,和我通過名稱結果要組第一,然後從每名組選擇一個行,這取決於一個人的等級最高。

附上的表格的示例中,我想從 enter image description here

+2

您能否提供一些樣本數據和期望的輸出? 「HAVING」子句可能是您要查找的內容:http://dev.mysql.com/doc/refman/5.1/en/select.html – Jens

+0

附表是一個示例表,謝謝 –

+1

每個名稱的1行輸出? – Drew

回答

2
mysql> SELECT t1.nm, t1.rank,t1.id 
FROM mytable t1 
LEFT JOIN (
    SELECT nm, max(rank) as top 
    FROM mytable t2 
    GROUP BY nm 
) AS t2 ON t1.nm=t2.nm AND t1.rank = t2.top 
WHERE t2.nm IS not NULL 
ORDER BY nm; 

+----+------+---------+ 
| nm | rank | id  | 
+----+------+---------+ 
| m | -1 | b7kjhsf | 
| n | 13 | d3sf | 
+----+------+---------+ 
2 rows in set (0.00 sec) 

mysql> select * from mytable; 

+----+------+----------+ 
| nm | rank | id  | 
+----+------+----------+ 
| n | 11 | asfd  | 
| n | 11 | bsf  | 
| n | 11 | zzasdfsf | 
| n | 13 | d3sf  | 
| n | 11 | effesf | 
| n | 10 | yxxgesf | 
| n | 11 | bkhjusf | 
| m | -1 | b7kjhsf | 
| m | -4 | cdfgabsf | 
+----+------+----------+ 
9 rows in set (0.00 sec) 
+0

這似乎是做了這項工作,但我怎樣才能將ID包含在select語句中呢? –

+0

@HassanMokdad對不起,修正了上面的問題,不知道你想去以後ID – Drew

+0

感謝您的幫助:) –

0

選擇正如其他答案提到的,唯一的選擇,我知道的,是使用公用表表達式:

;WITH CTE AS 
(
    T.Name, 
    T.Rank, 
    T.ID, 
    ROW_NUMBER() OVER 
     (PARTITION BY Name ORDER BY Rank DESC) 
    AS RowNumber 
    FROM MyTable 
) 

SELECT * 
FROM CTE 
WHERE RowNumber = 1 
0
SELECT Name, Id, Rank FROM 
(
    SELECT T.Name, T.Id, T.Rank, RANK() OVER (PARTITION BY T.Name ORDER BY T.Rank DESC) = 1 AS NameRank 
    FROM MyTable T 
) 
WHERE NameRank = 1 
0

不確定您是否只是試圖排除嵌套選擇,以及是否可以接受aginit的子選擇。如果是這樣的話: -

SELECT 
    T.Name, 
    T.Rank, 
    T.ID 
FROM MyTable T 
INNER JOIN (SELECT Name, MAX(Rank) AS MaxRank FROM MyTable GROUP BY Name) T1 
ON T.Name = T1.Name 
AND T.Rank = T1.MaxRank