Sql 在select语句中使用“order by”时出错(错误:“聚合函数或GROUP by子句”中不包含列)

Sql 在select语句中使用“order by”时出错(错误:“聚合函数或GROUP by子句”中不包含列),sql,sql-order-by,row-number,Sql,Sql Order By,Row Number,我在下面有一个表格,我想计算每个字母出现的连续次数。下面列出了用于重现我使用的表的代码,以帮助节省时间 CREATE TABLE table1 (id integer, names varchar(50)); INSERT INTO table1 VALUES (1,'A'); INSERT INTO table1 VALUES (2,'A'); INSERT INTO table1 VALUES (3,'B'); INSERT INTO table1 VALUES (4,'B

我在下面有一个表格,我想计算每个字母出现的连续次数。下面列出了用于重现我使用的表的代码,以帮助节省时间

CREATE TABLE table1 (id integer, names varchar(50));

  INSERT INTO table1 VALUES (1,'A');
  INSERT INTO table1 VALUES (2,'A');
  INSERT INTO table1 VALUES (3,'B');
  INSERT INTO table1 VALUES (4,'B');
  INSERT INTO table1 VALUES (5,'B');
  INSERT INTO table1 VALUES (6,'B');
  INSERT INTO table1 VALUES (7,'C');
  INSERT INTO table1 VALUES (8,'B');
  INSERT INTO table1 VALUES (9,'B');

  select * from table1; 
我发现已经在线编写了完成此任务的代码,我已经测试过,可以确认它运行成功。如图所示

select names, count(*) as count
from (select id, names, (row_number() over (order by id) - row_number() over (partition by names order by id)) as grp
      from table1
     ) as temp
group by grp, names
我试图在末尾添加ORDER BY条款,如下所示:

select names, count(*) as count
from (select id, names, (row_number() over (order by id) - row_number() over (partition by names order by id)) as grp
      from table1
     ) as temp
group by grp, names
order by id -- added this here, but it creates an error.
但在ORDER BY子句中,错误列temp.id无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。不过,我可以按姓名点菜。这里有什么区别

另外,为什么我不能在子查询中添加orderbyid?如果我自己运行这个子查询,请参见下文,那么order by id是可以的,但总的来说它无法运行。为什么会这样

select names, count(*) as count
from (select id, names, (row_number() over (order by id) - row_number() over (partition by names order by id)) as grp
      from table1
      order by id -- added this in here, but it creates an error. 
     ) as temp
group by grp, names
order by names
select语句以任意顺序返回行,除非它具有order by。这是SQL运算符在无序集上的扩展

您的select没有order by,因此您不应该假设数据将以任何特定顺序返回。若要按id获取结果,请将“按id排序”添加到“选择”

不断获取错误列temp.id在ORDER BY中无效 子句,因为它不包含在聚合函数或 GROUPBY子句。不过,我可以按姓名点菜。是什么 这里有什么区别

SQL按照一定的顺序进行操作。如果您的查询有一个组,而您的查询是由该组执行的,则首先执行该组。分组后,SQL唯一拥有的是选择和分组依据的列,因此这些列是order by子句中唯一可以使用的列

举个例子,想想街道上的房子。如果你查询房屋,返回颜色和数量,你可能会得到红色2,白色10,绿色3。但要求按地址编号对其进行排序毫无意义,因为我们返回的数据中没有这些信息。在您的例子中,您将返回名称、计数,并在GROUPBY子句中使用grp,因此这些是您可以用来对最终数据进行排序的唯一内容,因为它们是您所拥有的所有内容,也是所有有意义的内容

另外,为什么我不能在子查询中添加orderbyid?如果我跑 此子查询本身如下所示,那么按id排序就可以了, 但总的来说,它无法运行。为什么会这样


当您有一个子查询时,结果就像一个表一样使用。您可以对其进行连接,也可以像现在这样从中进行查询,但关键是该表的顺序对其他任何事情都没有影响。除非使用ORDERBY子句,否则基础表的条目顺序不能保证查询将按照该顺序进行。因为你在做分组练习,所以这个顺序毫无意义。因为子查询的顺序无效,SQL不允许您将其放入。

为什么您的select不使用order BY?我看到的唯一顺序是列数据