【问题标题】:Select all columns, group by one column with other requirements选择所有列,按具有其他要求的一列分组
【发布时间】:2016-07-25 15:36:02
【问题描述】:

这不是原始表,我创建了类似的情况以便更好地解释问题。 假设我有一个名为 [student] 的表,有 4 列:[name]、[gender]、[age]、[country]。

如何执行“SELECT *”查询以返回满足此要求的行:

  1. 学生必须是男性
  2. 每个国家只有一名学生
  3. 如果一个国家有多个学生,选择年龄最大的一个

我尝试在 [country] 上使用 GROUP BY,但不断收到错误“列 '...' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中”

【问题讨论】:

  • 任何不是聚合的列,都必须出现在 GROUP BY 子句中。向我们展示您现有的代码
  • SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY Age DESC) RN FROM myTable WHERE gender = 'male') T WHERE RN = 1; ?
  • @ZLK 它有效!如果您提交为答案,我会将您的标记为答案。多亏了你,我今天才知道 ROW_NUMBER 和 PARTITION。

标签: sql-server


【解决方案1】:

一种可能的方法:

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

子查询仅选择男学生,并根据年龄为他们分配一个行号,按国家/地区划分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2022-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多