MySQL Нумерация строк запроса на основе group by

#mysql #sql #window-functions

#mysql #sql #окно-функции

Вопрос:

У меня есть такая таблица

 id          name           city
-------------------------------
1            Ian           London
2            John          London
3            David         New York
4            Sylvia        Mumbai
5            Beryl         New York
6            Rashan        London
  

Я хотел бы получить данные с нумерацией строк, сгруппированных по городу. Вот так.

 name          city          count
-------------------------------
Ian           London          0
John          London          1
Rashan        London          2
Beryl         New York        0
David         New York        1
Sylvia        Mumbai          0
  

Я пытался с

 ROW_NUMBER() OVER (PARTITION BY City ORDER BY name)-1
  

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

Комментарии:

1. Ваш код должен делать то, что вы хотите. Пожалуйста, покажите нам весь ваш запрос.

2. select name, city, row_number() over (partition by city order by name)-1 from people; Работает для меня ™

3. @Mono . , , я думаю, вы просто хотите order by city, name в конце запроса.

Ответ №1:

Ваш код должен делать то, что вы хотите — однако вы упоминаете group by , что здесь не имеет значения. Запрос должен быть просто:

 select name, city, row_number() over(partition by city order by name) - 1 rn
from mytable
  

Комментарии:

1. Спасибо за вашу помощь, я понял, что допустил опечатку, и это работает.

Ответ №2:

Для получения результатов, которые вы указываете:

 select name, city, row_number() over (partition by city, order by name) as count
from t
order by count(*) over (partition by city) desc,  -- number of rows in city
         city,
         name;
  

Похоже, вам нужны города, упорядоченные по количеству имен в городе.