2016-07-25 63 views
0

這不是原始表,我創建了類似的情況,以便我可以更好地解釋問題。 假設我有一張名爲[學生]的表,有4列:[姓名],[性別],[年齡],[國家]。選擇所有列,按其他要求組合一列

如何做一個「SELECT *」查詢,返回符合這一要求的行:

  1. 學生必須是男性
  2. 每個國家
  3. 只有一個學生,如果有一個以上來自一個國家的學生,選擇最老的一個

我試着在[country]上使用GROUP BY,但不斷收到錯誤「Column'...'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句」

+0

任何非合計的列必須出現在GROUP BY子句中。向我們顯示您現有的代碼 – Squirrel

+0

'SELECT * FROM(SELECT *,ROW_NUMBER()OVER(PARTITION BY ORDER BY Age DESC)RN FROM myTable WHERE gender ='male')T WHERE RN = 1;'? – ZLK

+0

@ZLK它的工作原理!如果您提交答案,我會將您的答案標記爲答案。感謝你,我今天剛剛瞭解了ROW_NUMBER和PARTITION。 – ogrimmar

回答

0

一個可行的方法:

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY Age DESC) RN 
    FROM students 
    WHERE gender = 'male') T 
WHERE RN = 1; 

子查詢只選擇男學生,併爲它們分配基於他們的年齡行號,按國家劃分。