ошибка при использовании «order by» в операторе выбора (ошибка: столбец не содержится ни в «агрегатной функции, ни в предложении GROUP BY») - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица ниже, и я хочу подсчитать количество последовательных вхождений каждой буквы. Код для воспроизведения таблицы, которую я использую, указан для тех, кто помогает сэкономить время.

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.

но продолжал получать сообщение об ошибке «Столбец temp.id» недопустимо в предложении ORDER BY, потому что оно не содержится ни в статистической функции, ни в предложении GROUP BY. " Впрочем, я могу заказывать по «именам». В чем здесь разница?

Кроме того, почему я не могу добавить "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

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

продолжал получать ошибку "Столбец" temp.id "недействителен в ORDER BY предложение, потому что оно не содержится ни в статистической функции, ни в предложение GROUP BY. «Однако я могу заказывать по« именам ». разница здесь?

SQL делает вещи в определенном порядке. Если у вашего запроса есть GROUP BY (что у вас есть), это делается в первую очередь. После группировки в SQL есть только столбцы, которые выбираются и группируются, поэтому это единственные столбцы, которые можно использовать в предложении order by.

В качестве примера, представьте себе дома на улице. Если вы сделали запрос по домам, возвращая цвет и количество, вы можете получить что-то вроде Красного 2, Белого 10, Зеленого 3. Но просить отсортировать это по номеру адреса не имеет смысла, потому что эта информация отсутствует в данных, которые мы возвратили , В вашем случае вы возвращаете имена, count и использовали grp в выражении group by, так что это единственное, что вы можете использовать для сортировки окончательных данных, потому что это все, что у вас есть, и все, что имеет смысл.

Кроме того, почему я не могу добавить "order by id" в подзапрос? Если я бегу этот подзапрос сам по себе (см. ниже), то «порядок по идентификатору» в порядке, но все вместе это не может бежать. Почему это?

Когда у вас есть подзапрос, результаты используются, как если бы они были таблицей. Вы можете присоединиться к нему или запросить его, как вы, но суть в том, что порядок этой таблицы не влияет ни на что другое. Порядок ввода базовой таблицы не является гарантией того, что ваш запрос будет выполнен в таком порядке, если только вы не используете предложение order by. И поскольку вы делаете группу, этот порядок все равно ничего не значит. Поскольку порядок подзапроса не влияет, SQL не позволит вам его вставить.

0 голосов
/ 08 ноября 2018

Оператор select возвращает строки в произвольном порядке - если только он не имеет order by. Это расширение того факта, что операторы SQL на неупорядоченных множествах.

Ваш select не имеет order by, поэтому вы не должны предполагать, что данные вернутся в каком-либо конкретном порядке. Чтобы получить порядок результатов по идентификатору, добавьте order by id к select.

...