2016-07-25 66 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; 

子查询只选择男学生,并为它们分配基于他们的年龄行号,按国家划分。