以下SQL查询有什么问题?

时间:2018-01-29 03:40:34

标签: sql greatest-n-per-group

我有以下SQL查询,它查找最古老的滑雪板的名称和年龄。

SELECT c.cname, MAX(c.age)  
FROM Customers c  
WHERE c.type = 'snowboard';

但我正在阅读的指南说查询是错误的,因为SELECT子句中的非聚合列必须来自GROUP BY子句中的属性。

我认为此查询符合其目的,因为聚合MAX(c.age)对应于单个值。它确实找到了最古老的滑雪板的年龄。

3 个答案:

答案 0 :(得分:0)

您需要按c.cname列进行分组。每当您对某些列(如SUM,COUNT等)进行任何聚合时,您需要提供另一个要聚合的列。您通常会在SELECT子句(此处为c.cname)中提供这些列。 GROUP BY子句中应该提到这些相同的列,否则会出现语法错误。

表格应为

SELECT A, B, C, SUM(D)
FROM TABLE_NAME
GROUP BY A, B, C;

您的查询应如下所示

SELECT  c.cname,    MAX(c.age)  
FROM    Customers   c  
WHERE   c.type=‘snowboard’
GROUP BY c.cname;

答案 1 :(得分:0)

如果您想显示最古老的滑雪板的名称和年龄,您必须这样做:

SELECT  c.cname, c.age
FROM    Customers   c  
WHERE   c.type = 'snowboard'
AND c.age = (SELECT MAX(age)
             FROM Customers
             WHERE type = 'snowboard')

答案 2 :(得分:0)

每当选择其他表属性和聚合函数时,它必须伴随group by子句,否则可能会出现数据库可能不知道必须选择哪一行的情况。让我们说在您的示例中有两个客户具有相同的最大年龄,现在数据库将尝试从两个行中提取年龄但是它会混淆,这个名称要选择。这里您的group by子句将进入图片,它将指示显示具有不同客户名称但具有相同最大年龄的两个不同行。 因此,您的查询应如下所示:

SELECT  c.cname,    MAX(c.age)  
FROM    Customers   c  
WHERE   c.type=‘snowboard’
GROUP BY c.cname;